ZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU3Y2YxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyOWNjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyMGU1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBBcHIgMTYgMTc6NTY6MDUgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMjZkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNXZWQgSmFuIDMxIDE1OjMyOjEyIFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTY2ZDVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNTdW4gQXByIDE2IDE3OjU1OjAyIEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjdjZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4zLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYWU3MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiMzdkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldCI+Ci0gIDxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLSAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjVkZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGx1Z2luTmFtZSA9IFByb2plY3QgRmFjZXQgQ29yZSAoSmF2YSBTdXBwb3J0KQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLWpzdEphdmFGYWNldExhYmVsID0gSmF2YQotanN0SmF2YUZhY2V0RGVzY3JpcHRpb24gPSBBZGRzIHN1cHBvcnQgZm9yIHdyaXRpbmcgYXBwbGljYXRpb25zIHVzaW5nIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi1qYXZhVmVyc2lvbk1pc21hdGNoTWFya2VyTmFtZSA9IEZhY2V0ZWQgUHJvamVjdCBQcm9ibGVtIChKYXZhIFZlcnNpb24gTWlzbWF0Y2gpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTViMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeSAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDbGFzc3BhdGhQcm92aWRlciIvPgotICAgIDwvZmFjdG9yeT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZUJyaWRnZXMiPgotICAgIDxicmlkZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhUnVudGltZUJyaWRnZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhUnVudGltZUJyaWRnZSIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXR5cGUgaWQ9InN0YW5kYXJkLmpyZSIvPgotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uIHR5cGU9InN0YW5kYXJkLmpyZSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24gdHlwZT0ic3RhbmRhcmQuanJlIiB2ZXJzaW9uPSIxLjQiLz4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbiB0eXBlPSJzdGFuZGFyZC5qcmUiIHZlcnNpb249IjUuMCIvPgotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uIHR5cGU9InN0YW5kYXJkLmpyZSIgdmVyc2lvbj0iNi4wIi8+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPGZhY2V0IGlkPSJqc3QuamF2YSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9InN0YW5kYXJkLmpyZSIgdmVyc2lvbj0iWzEuMyIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxmYWNldCBpZD0ianN0LmphdmEiIHZlcnNpb249IjEuNCIvPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJzdGFuZGFyZC5qcmUiIHZlcnNpb249IlsxLjQiLz4KLSAgICA8L3N1cHBvcnRlZD4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI1LjAiLz4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ic3RhbmRhcmQuanJlIiB2ZXJzaW9uPSJbNS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPGZhY2V0IGlkPSJqc3QuamF2YSIgdmVyc2lvbj0iNi4wIi8+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9InN0YW5kYXJkLmpyZSIgdmVyc2lvbj0iWzYuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotICAgIAotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJzdGFuZGFyZC5qcmUiLz4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5TdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImpzdC5qYXZhIj4KLSAgICAgIDxsYWJlbD4lanN0SmF2YUZhY2V0TGFiZWw8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPiVqc3RKYXZhRmFjZXREZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhRmFjZXREZWZhdWx0VmVyc2lvblByb3ZpZGVyIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjEuMyI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0id3N0LndlYiIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjEuNCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0id3N0LndlYiIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjUuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0id3N0LndlYiIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjYuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0id3N0LndlYiIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPGFjdGlvbiBmYWNldD0ianN0LmphdmEiIHR5cGU9Imluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0ZhY3RvcnkiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC5qYXZhIiB0eXBlPSJ1bmluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5KYXZhRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotCi0gICAgPGFjdGlvbiBmYWNldD0ianN0LmphdmEiIHR5cGU9InZlcnNpb24tY2hhbmdlIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnMiPgotICAgICA8bGlzdGVuZXIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0UnVudGltZUNoYW5nZWRMaXN0ZW5lciIKLSAgICAgICBldmVudFR5cGVzPSJQUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnZhbGlkYXRvcnMiPgotICAgIDx2YWxpZGF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkphdmFGYWNldFZhbGlkYXRvciI+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5qYXZhIi8+Ci0gICAgPC92YWxpZGF0b3I+Ci0gIDwvZXh0ZW5zaW9uPiAgICAKLQotICA8ZXh0ZW5zaW9uIAotICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIgotICAgIGlkPSJqYXZhVmVyc2lvbk1pc21hdGNoIgotICAgIG5hbWU9IiVqYXZhVmVyc2lvbk1pc21hdGNoTWFya2VyTmFtZSI+Ci0gICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnZhbGlkYXRpb24ubWFya2VyIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldFZlcnNpb24iLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXBpbGVyTGV2ZWwiLz4KLSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0NsYXNzcGF0aEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvQ2xhc3NwYXRoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2NhZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvQ2xhc3NwYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogPHA+QSB1dGlsaXR5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBJQ2xhc3NwYXRoUHJvdmlkZXIgaW4gb3JkZXIgdG8gbWFuYWdlCi0gKiB0aGUgYm9va2tlZXBpbmcgd2hlbiBwcm9qZWN0IGZhY2V0cyBhcmUgaW5zdGFsbGVkIGFuZCB1bmluc3RhbGxlZCwgYW5kIHdoZW4KLSAqIHRoZSBib3VuZCBydW50aW1lIGNoYW5nZXMuIFRoaXMgdXRpbGl0eSB0cmFja3Mgd2hpY2ggY2xhc3NwYXRoIGVudHJpZXMgd2VyZQotICogYWRkZWQgdG8gdGhlIHByb2plY3QgYnkgd2hpY2ggZmFjZXQgYW5kIHN0b3JlcyB0aGlzIGluZm9ybWF0aW9uIGluIGEgcHJvamVjdAotICogbWV0YWRhdGEgZmlsZS4gVGhpcyBlbmFibGVzIHRoZSBjbGFzc3BhdGggZW50cmllcyB0byBiZSByZW1vdmVkIHdpdGhvdXQKLSAqIGtub3dpbmcgd2hhdCB0aGV5IGFyZS4gSXQgaXMgb25seSBuZWNlc3NhcnkgdG8ga25vdyB3aGljaCBmYWNldCBhZGRlZCB0aGVtLgotICogVGhpcyB1dGlsaXR5IHN1cHBvcnRzIHRoZSBjYXNlIHdoZXJlIHRoZSBzYW1lIGNsYXNzcGF0aCBlbnRyeSBpcyBhZGRlZCBieQotICogbXVsdGlwbGUgcHJvamVjdCBmYWNldHMuIEluIHRoaXMgc2l0dWF0aW9uLCBhIGNsYXNzcGF0aCBlbnRyeSBpcyBvbmx5Ci0gKiByZW1vdmVkIHdoZW4gdGhlIHJlbW92YWwgaGFzIGJlZW4gcmVxdWVzdGVkIGZvciBhbGwgb2YgdGhlIGZhY2V0cyB0aGF0IGFkZGVkCi0gKiBpdC48L3A+Ci0gKiAKLSAqIDxwPlR5cGljYWxseSB0aGUgcHJvamVjdCBmYWNldCBhdXRob3Igd2lsbCB3cml0ZSBzb21ldGhpbmcgbGlrZSB0aGlzIGluIHRoZQotICogaW5zdGFsbCBkZWxlZ2F0ZTo8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiBpZiggISBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYgKQotICogewotICogICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIGJvdW5kIHJ1bnRpbWUgb3Igd2hlbiB0aGUgYm91bmQKLSAqICAgICAvLyBydW50aW1lIGNhbm5vdCBwcm92aWRlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGlzIGZhY2V0LgotICogICAgIAotICogICAgIGZpbmFsIExpc3QgYWx0ZXJuYXRlID0gLi4uOwotICogICAgIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgYWx0ZXJuYXRlICk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIAotICogPHA+QW5kIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhlIHVuaW5zdGFsbCBkZWxlZ2F0ZTo8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiBDbGFzc3BhdGhIZWxwZXIucmVtb3ZlQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYgKTsKLSAqIDwvcHJlPgotICogCi0gKiA8cD5BbmQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbiB0aGUgcnVudGltZSBjaGFuZ2VkIGRlbGVnYXRlOjwvcD4KLSAqIAotICogPHByZT4KLSAqIENsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiApOwotICogCi0gKiBpZiggISBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYgKQotICogewotICogICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIGJvdW5kIHJ1bnRpbWUgb3Igd2hlbiB0aGUgYm91bmQKLSAqICAgICAvLyBydW50aW1lIGNhbm5vdCBwcm92aWRlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGlzIGZhY2V0LgotICogICAgIAotICogICAgIGZpbmFsIExpc3QgYWx0ZXJuYXRlID0gLi4uOwotICogICAgIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgYWx0ZXJuYXRlICk7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqIAotICogPHA+QW5kIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhlIHZlcnNpb24gY2hhbmdlIGRlbGVnYXRlOjwvcD4KLSAqIAotICogPHByZT4KLSAqIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIG9sZHZlcgotICogICA9IGZwcm9qLmdldEluc3RhbGxlZFZlcnNpb24oIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gKiAKLSAqIENsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBvbGR2ZXIgKTsKLSAqIAotICogaWYoICEgQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2ICkKLSAqIHsKLSAqICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBib3VuZCBydW50aW1lIG9yIHdoZW4gdGhlIGJvdW5kCi0gKiAgICAgLy8gcnVudGltZSBjYW5ub3QgcHJvdmlkZSBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhpcyBmYWNldC4KLSAqICAgICAKLSAqICAgICBmaW5hbCBMaXN0IGFsdGVybmF0ZSA9IC4uLjsKLSAqICAgICBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYsIGFsdGVybmF0ZSApOwotICogfQotICogPC9wcmU+Ci0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhIZWxwZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgU1lTVEVNX09XTkVSID0gbmV3IE9iamVjdCgpOwotICAgIAotICAgIHByaXZhdGUgQ2xhc3NwYXRoSGVscGVyKCkge30KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGFkZGluZyB0byB0aGUgcHJvamVjdCB0aGUgY2xhc3NwYXRoIGVudHJpZXMKLSAgICAgKiBwcm92aWRlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZhY2V0IGJ5IHRoZSBydW50aW1lIGJvdW5kIHRvIHRoZQotICAgICAqIHByb2plY3QuIFRoZSBlbnRyaWVzIGFyZSBtYXJrZWQgYXMgYmVsb25naW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotICAgICAqIGZhY2V0LgotICAgICAqICAgCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHdpbGwgb3duIHRoZXNlIGVudHJpZXMKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNsYXNzcGF0aCBlbnRyaWVzIHdlcmUgYWRkZWQsIG9yCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcnVudGltZSBib3VuZCB0byB0aGUgcHJvamVjdCBvciBpZgotICAgICAqICAgaXQgY2Fubm90IHByb3ZpZGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmFjZXQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIGFkZGluZyB0aGUgY2xhc3NwYXRoIGVudHJpZXMKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQ2xhc3NwYXRoRW50cmllcyggZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgCi0gICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpOwotICAgICAgICAKLSAgICAgICAgaWYoIHJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhQcm92aWRlciBjcHByb3YgCi0gICAgICAgICAgICAgICAgPSAoSUNsYXNzcGF0aFByb3ZpZGVyKSBydW50aW1lLmdldEFkYXB0ZXIoIElDbGFzc3BhdGhQcm92aWRlci5jbGFzcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBMaXN0IGNwZW50cmllcyA9IGNwcHJvdi5nZXRDbGFzc3BhdGhFbnRyaWVzKCBmdiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY3BlbnRyaWVzICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGZ2LCBjcGVudHJpZXMgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIHByb3ZpZGVkIGNsYXNzcGF0aCBlbnRyaWVzIHRvIHByb2plY3QgYW5kIG1hcmtzIHRoZW0gYXMgYmVsb25naW5nCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZhY2V0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGZ2IHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gdGhhdCB3aWxsIG93biB0aGVzZSBlbnRyaWVzCi0gICAgICogQHBhcmFtIGNwZW50cmllcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgKGVsZW1lbnQgdHlwZTogCi0gICAgICogICB7QHNlZSBJQ2xhc3NwYXRoRW50cnl9KQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgYWRkaW5nIHRoZSBjbGFzc3BhdGggZW50cmllcwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDbGFzc3BhdGhFbnRyaWVzKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdCBjcGVudHJpZXMgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUoIHByb2plY3QgKTsKLSAgICAgICAgICAgIGZpbmFsIExpc3QgY3AgPSBnZXRDbGFzc3BhdGgoIGpwcm9qICk7Ci0gICAgICAgICAgICBib29sZWFuIGNwY2hhbmdlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBmaW5hbCBNYXAgcHJlZnMgPSByZWFkUHJlZmVyZW5jZXMoIHByb2plY3QgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIgPSBjcGVudHJpZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gY3BlbnRyeS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjb250YWlucyA9IGNwLmNvbnRhaW5zKCBjcGVudHJ5ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2V0IG93bmVycyA9IChTZXQpIHByZWZzLmdldCggcGF0aCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBvd25lcnMgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvd25lcnMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjb250YWlucyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG93bmVycy5hZGQoIFNZU1RFTV9PV05FUiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwcmVmcy5wdXQoIHBhdGgsIG93bmVycyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBvd25lcnMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGNvbnRhaW5zICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNwLmFkZCggY3BlbnRyeSApOwotICAgICAgICAgICAgICAgICAgICBjcGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNwY2hhbmdlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0Q2xhc3NwYXRoKCBqcHJvaiwgY3AgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgd3JpdGVQcmVmZXJlbmNlcyggcHJvamVjdCwgcHJlZnMgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0Ci0gICAgICAgICAgICAgICAgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5mYWlsZWRXcml0aW5nUHJlZmVyZW5jZXMsIGUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgYmVsb25naW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldC4KLSAgICAgKiBBbnkgZW50cmllcyB0aGF0IGFsc28gYmVsb25nIHRvIGFub3RoZXIgZmFjZXQgYXJlIGxlZnQgaW4gcGxhY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdGhhdCBvd25zIHRoZSBlbnRyaWVzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIHJlbW92aW5nIGNsYXNzcGF0aCBlbnRyaWVzCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNsYXNzcGF0aEVudHJpZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0IGNwID0gZ2V0Q2xhc3NwYXRoKCBqcHJvaiApOwotICAgICAgICAgICAgYm9vbGVhbiBjcGNoYW5nZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZmluYWwgTWFwIHByZWZzID0gcmVhZFByZWZlcmVuY2VzKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IHByZWZzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyMS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdHIxLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gKElQYXRoKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQgb3duZXJzID0gKFNldCkgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggb3duZXJzLmNvbnRhaW5zKCBmdiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG93bmVycy5yZW1vdmUoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggb3duZXJzLnNpemUoKSA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaXRyMS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIyID0gY3AuaXRlcmF0b3IoKTsgaXRyMi5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlbnRyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChJQ2xhc3NwYXRoRW50cnkpIGl0cjIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjcGVudHJ5LmdldFBhdGgoKS5lcXVhbHMoIHBhdGggKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHIyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBjcGNoYW5nZWQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldENsYXNzcGF0aCgganByb2osIGNwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdyaXRlUHJlZmVyZW5jZXMoIHByb2plY3QsIHByZWZzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdAotICAgICAgICAgICAgICAgID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZmFpbGVkV3JpdGluZ1ByZWZlcmVuY2VzLCBlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBzdCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIExpc3QgZ2V0Q2xhc3NwYXRoKCBmaW5hbCBJSmF2YVByb2plY3QganByb2ogKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKCBjcFsgaSBdICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldENsYXNzcGF0aCggZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGNwICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdjcAotICAgICAgICAgICAgPSAoSUNsYXNzcGF0aEVudHJ5W10pIGNwLnRvQXJyYXkoIG5ldyBJQ2xhc3NwYXRoRW50cnlbIGNwLnNpemUoKSBdICk7Ci0gICAgICAgIAotICAgICAgICBqcHJvai5zZXRSYXdDbGFzc3BhdGgoIG5ld2NwLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIE1hcCByZWFkUHJlZmVyZW5jZXMoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgICAgICB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZXMgcm9vdCA9IGdldFByZWZlcmVuY2VzTm9kZSggcHJvamVjdCApOwotICAgICAgICBmaW5hbCBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGtleXMgPSByb290LmNoaWxkcmVuTmFtZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBrZXlzWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlcyBub2RlID0gcm9vdC5ub2RlKCBrZXkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXJzID0gbm9kZS5nZXQoICJvd25lcnMiLCBudWxsICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG93bmVycyAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzcGxpdCA9IG93bmVycy5zcGxpdCggIjsiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IHNwbGl0Lmxlbmd0aDsgaisrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWdtZW50ID0gc3BsaXRbIGogXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBzZWdtZW50LmVxdWFscyggIiNzeXN0ZW0jIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKCBTWVNURU1fT1dORVIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcGFyc2VGZWF0dXJlVmVyc2lvbiggc2VnbWVudCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQucHV0KCBkZWNvZGUoIGtleSApLCBzZXQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVByZWZlcmVuY2VzKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwIHByZWZzICkKLSAgICAKLSAgICAgICAgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFByZWZlcmVuY2VzIHJvb3QgPSBnZXRQcmVmZXJlbmNlc05vZGUoIHByb2plY3QgKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gY2hpbGRyZW4gPSByb290LmNoaWxkcmVuTmFtZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICByb290Lm5vZGUoIGNoaWxkcmVuWyBpIF0gKS5yZW1vdmVOb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSXRlcmF0b3IgaXRyMSA9IHByZWZzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRyMS5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRyMS5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gKElQYXRoKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIFNldCBvd25lcnMgPSAoU2V0KSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjIgPSBvd25lcnMuaXRlcmF0b3IoKTsgaXRyMi5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb3duZXIgPSBpdHIyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBidWYubGVuZ3RoKCkgPiAwICkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnOycgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG93bmVyID09IFNZU1RFTV9PV05FUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiI3N5c3RlbSMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgb3duZXI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICc6JyApOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VzIG5vZGUgPSByb290Lm5vZGUoIGVuY29kZSggcGF0aCApICk7Ci0gICAgICAgICAgICBub2RlLnB1dCggIm93bmVycyIsIGJ1Zi50b1N0cmluZygpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcm9vdC5mbHVzaCgpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlc05vZGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgZmluYWwgUHJvamVjdFNjb3BlIHNjb3BlID0gbmV3IFByb2plY3RTY29wZSggcHJvamVjdCApOwotICAgICAgICBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHBsdWdpblJvb3QgPSBzY29wZS5nZXROb2RlKCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lEICk7Ci0gICAgICAgIHJldHVybiBwbHVnaW5Sb290Lm5vZGUoICJjbGFzc3BhdGguaGVscGVyIiApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIHBhcnNlRmVhdHVyZVZlcnNpb24oIGZpbmFsIFN0cmluZyBzdHIgKQotICAgIHsKLSAgICAgICAgZmluYWwgaW50IGNvbG9uID0gc3RyLmluZGV4T2YoICc6JyApOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBzdHIuc3Vic3RyaW5nKCAwLCBjb2xvbiApOwotICAgICAgICBmaW5hbCBTdHJpbmcgdmVyID0gc3RyLnN1YnN0cmluZyggY29sb24gKyAxICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBpZCApLmdldFZlcnNpb24oIHZlciApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlKCBmaW5hbCBJUGF0aCBwYXRoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkucmVwbGFjZUFsbCggIi8iLCAiOjoiICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBkZWNvZGUoIGZpbmFsIFN0cmluZyBwYXRoICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUGF0aCggcGF0aC5yZXBsYWNlQWxsKCAiOjoiLCAiLyIgKSApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkV3JpdGluZ1ByZWZlcmVuY2VzOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggQ2xhc3NwYXRoSGVscGVyLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9DbGFzc3BhdGhIZWxwZXIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0NsYXNzcGF0aEhlbHBlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVhZWUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0NsYXNzcGF0aEhlbHBlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmFpbGVkV3JpdGluZ1ByZWZlcmVuY2VzID0gRmFpbGVkIHdoaWxlIHdyaXRpbmcgcHJlZmVyZW5jZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNsYXNzcGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwMmRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGEgcnVudGltZSBjb21wb25lbnQgYWRhcHRlciBpbiBvcmRlciB0byBwcm92aWRlCi0gKiBjbGFzc3BhdGggZW50cmllcyBmb3IgcHJvamVjdCBmYWNldHMuIEZvciBjb252ZW5pZW5jZSwgdGhlIHJ1bnRpbWUgY2FuIGFsc28KLSAqIGJlIGFkYXB0ZWQgdG8gdGhpcyBpbnRlcmZhY2UuIFRoYXQgYWRhcHRlciB3aWxsIGRlbGVnYXRlIHRvIHRoZSBydW50aW1lIAotICogY29tcG9uZW50cyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIHJ1bnRpbWUuIFRoZSBmaXJzdCBvbmUgCi0gKiB0aGF0IGNhbiBwcm92aWRlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgd2lucy4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aFByb3ZpZGVyCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbgotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldCwgb3IKLSAgICAgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgcHJvdmlkZXIgZG9lcyBub3QgcHJvdmlkZSBjbGFzc3BhdGggZW50cmllcwotICAgICAqICAgZm9yIHRoZSBnaXZlbiBwcm9qZWN0IGZhY2V0Ci0gICAgICovCi0gICAgCi0gICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGdldENsYXNzcGF0aEVudHJpZXMoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9KYXZhRmFjZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQyZGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhRmFjZXQgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAianN0LmphdmEiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEZBQ0VUIAotICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggSUQgKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfMTMKLSAgICAgICAgPSBGQUNFVC5nZXRWZXJzaW9uKCAiMS4zIiApOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzE0Ci0gICAgICAgID0gRkFDRVQuZ2V0VmVyc2lvbiggIjEuNCIgKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gSkFWQV81MAotICAgICAgICA9IEZBQ0VULmdldFZlcnNpb24oICI1LjAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfNjAKLSAgICAgICAgPSBGQUNFVC5nZXRWZXJzaW9uKCAiNi4wIiApOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnN0YWxsZWQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQoIHByb2plY3QsIElEICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldEluc3RhbGxDb25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0phdmFGYWNldEluc3RhbGxDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4NGQyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5FdmVudExpc3RlbmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5JRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YUZhY2V0SW5zdGFsbENvbmZpZwotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EX1BST1BfT1VUUFVUX0ZPTERFUiA9ICJkZWZhdWx0SmF2YU91dHB1dEZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRF9QUk9QX09VVFBVVF9GT0xERVJfTEVHQUNZID0gIm91dHB1dEZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PVVRQVVRfRk9MREVSID0gImJ1aWxkL2NsYXNzZXMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGFuZ2VFdmVudAotICAgIHsKLSAgICAgICAgcHVibGljIGVudW0gVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBTT1VSQ0VfRk9MREVSU19DSEFOR0VELAotICAgICAgICAgICAgREVGQVVMVF9PVVRQVVRfRk9MREVSX0NIQU5HRUQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBpbnN0YWxsQ29uZmlnOwotICAgICAgICAKLSAgICAgICAgQ2hhbmdlRXZlbnQoIGZpbmFsIFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEphdmFGYWNldEluc3RhbGxDb25maWcgaW5zdGFsbENvbmZpZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmluc3RhbGxDb25maWcgPSBpbnN0YWxsQ29uZmlnOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgVHlwZSBnZXRUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGdldEphdmFGYWNldEluc3RhbGxDb25maWcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YWxsQ29uZmlnOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRXZlbnRMaXN0ZW5lclJlZ2lzdHJ5PENoYW5nZUV2ZW50LlR5cGUsQ2hhbmdlRXZlbnQ+IGxpc3RlbmVyczsKLSAgICBwcml2YXRlIExpc3Q8SVBhdGg+IHNvdXJjZUZvbGRlcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PElQYXRoPiBzb3VyY2VGb2xkZXJzUmVhZE9ubHk7Ci0gICAgcHJpdmF0ZSBJUGF0aCBkZWZhdWx0T3V0cHV0Rm9sZGVyOwotICAgIAotICAgIHB1YmxpYyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKCkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEV2ZW50TGlzdGVuZXJSZWdpc3RyeTxDaGFuZ2VFdmVudC5UeXBlLENoYW5nZUV2ZW50PiggQ2hhbmdlRXZlbnQuVHlwZS5jbGFzcyApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zb3VyY2VGb2xkZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElQYXRoPigpOwotICAgICAgICB0aGlzLnNvdXJjZUZvbGRlcnNSZWFkT25seSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIHRoaXMuc291cmNlRm9sZGVycyApOwotICAgICAgICB0aGlzLmRlZmF1bHRPdXRwdXRGb2xkZXIgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNvdXJjZUZvbGRlciA9IEZhY2V0Q29yZVBsdWdpbi5nZXRKYXZhU3JjRm9sZGVyKCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNvdXJjZUZvbGRlcnMuYWRkKCBuZXcgUGF0aCggc291cmNlRm9sZGVyICkgKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBvdXRwdXRGb2xkZXIgPSBnZXRQcm9kdWN0UHJvcGVydHkoIFBST0RfUFJPUF9PVVRQVVRfRk9MREVSICk7Ci0gICAgICAgIAotICAgICAgICBpZiggb3V0cHV0Rm9sZGVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIgPSBnZXRQcm9kdWN0UHJvcGVydHkoIFBST0RfUFJPUF9PVVRQVVRfRk9MREVSX0xFR0FDWSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggb3V0cHV0Rm9sZGVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIgPSBERUZBVUxUX09VVFBVVF9GT0xERVI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuZGVmYXVsdE91dHB1dEZvbGRlciA9IG5ldyBQYXRoKCBvdXRwdXRGb2xkZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SVBhdGg+IGdldFNvdXJjZUZvbGRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlRm9sZGVyc1JlYWRPbmx5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VGb2xkZXJzKCBmaW5hbCBMaXN0PElQYXRoPiBwYXRocyApCi0gICAgewotICAgICAgICBpZiggISB0aGlzLnNvdXJjZUZvbGRlcnMuZXF1YWxzKCBwYXRocyApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zb3VyY2VGb2xkZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZUZvbGRlcnMuYWRkQWxsKCBwYXRocyApOwotCi0gICAgICAgICAgICBmaW5hbCBDaGFuZ2VFdmVudCBldmVudCA9IG5ldyBDaGFuZ2VFdmVudCggQ2hhbmdlRXZlbnQuVHlwZS5TT1VSQ0VfRk9MREVSU19DSEFOR0VELCB0aGlzICk7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5ub3RpZnlMaXN0ZW5lcnMoIENoYW5nZUV2ZW50LlR5cGUuU09VUkNFX0ZPTERFUlNfQ0hBTkdFRCwgZXZlbnQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VGb2xkZXIoIGZpbmFsIElQYXRoIHBhdGggKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gbmV3U291cmNlRm9sZGVyczsKLSAgICAgICAgCi0gICAgICAgIGlmKCBwYXRoID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXdTb3VyY2VGb2xkZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXdTb3VyY2VGb2xkZXJzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggcGF0aCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzZXRTb3VyY2VGb2xkZXJzKCBuZXdTb3VyY2VGb2xkZXJzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFNvdXJjZUZvbGRlciggZmluYWwgSVBhdGggcGF0aCApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PElQYXRoPiBuZXdTb3VyY2VGb2xkZXJzID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oIGdldFNvdXJjZUZvbGRlcnMoKSApOwotICAgICAgICBuZXdTb3VyY2VGb2xkZXJzLmFkZCggcGF0aCApOwotICAgICAgICBzZXRTb3VyY2VGb2xkZXJzKCBuZXdTb3VyY2VGb2xkZXJzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNvdXJjZUZvbGRlciggZmluYWwgSVBhdGggcGF0aCApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PElQYXRoPiBuZXdTb3VyY2VGb2xkZXJzID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oIGdldFNvdXJjZUZvbGRlcnMoKSApOwotICAgICAgICBuZXdTb3VyY2VGb2xkZXJzLnJlbW92ZSggcGF0aCApOwotICAgICAgICBzZXRTb3VyY2VGb2xkZXJzKCBuZXdTb3VyY2VGb2xkZXJzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUGF0aCBnZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRPdXRwdXRGb2xkZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRPdXRwdXRGb2xkZXIoIGZpbmFsIElQYXRoIGRlZmF1bHRPdXRwdXRGb2xkZXIgKQotICAgIHsKLSAgICAgICAgaWYoICEgZXF1YWwoIHRoaXMuZGVmYXVsdE91dHB1dEZvbGRlciwgZGVmYXVsdE91dHB1dEZvbGRlciApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kZWZhdWx0T3V0cHV0Rm9sZGVyID0gZGVmYXVsdE91dHB1dEZvbGRlcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgQ2hhbmdlRXZlbnQoIENoYW5nZUV2ZW50LlR5cGUuREVGQVVMVF9PVVRQVVRfRk9MREVSX0NIQU5HRUQsIHRoaXMgKTsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLm5vdGlmeUxpc3RlbmVycyggQ2hhbmdlRXZlbnQuVHlwZS5ERUZBVUxUX09VVFBVVF9GT0xERVJfQ0hBTkdFRCwgZXZlbnQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUV2ZW50TGlzdGVuZXI8Q2hhbmdlRXZlbnQ+IGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDaGFuZ2VFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzLmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgdHlwZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElFdmVudExpc3RlbmVyPENoYW5nZUV2ZW50PiBsaXN0ZW5lciApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsKCBmaW5hbCBPYmplY3Qgb2JqMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqMiApCi0gICAgewotICAgICAgICBpZiggb2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvYmoxLmVxdWFscyggb2JqMiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9kdWN0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBwcm9wTmFtZSApCi0gICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYoIFBsYXRmb3JtLmdldFByb2R1Y3QoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWUgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoIHByb3BOYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9TdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1N0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDIxOTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1N0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJzdGFuZGFyZC5qcmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgVFlQRSAKLSAgICAgICAgPSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSggVFlQRV9JRCApOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIFZFUlNJT05fMV8zCi0gICAgICAgID0gVFlQRS5nZXRWZXJzaW9uKCAiMS4zIiApOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gVkVSU0lPTl8xXzQKLSAgICAgICAgPSBUWVBFLmdldFZlcnNpb24oICIxLjQiICk7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIFZFUlNJT05fNV8wCi0gICAgICAgID0gVFlQRS5nZXRWZXJzaW9uKCAiNS4wIiApOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gVkVSU0lPTl82XzAKLSAgICAgICAgPSBUWVBFLmdldFZlcnNpb24oICI2LjAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfVFlQRSA9ICJ2bS1pbnN0YWxsLXR5cGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZUNvbXBvbmVudCBjcmVhdGUoIGZpbmFsIElWTUluc3RhbGwgdm1JbnN0YWxsICkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBqdm12ZXIgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYoIHZtSW5zdGFsbCBpbnN0YW5jZW9mIElWTUluc3RhbGwyICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVZNSW5zdGFsbDIgdm1JbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotICAgICAgICAgICAganZtdmVyID0gdm1JbnN0YWxsMi5nZXRKYXZhVmVyc2lvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2OwotICAgICAgICAKLSAgICAgICAgaWYoIGp2bXZlciA9PSBudWxsICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjdiA9IFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5WRVJTSU9OXzZfMDsKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZSBpZigganZtdmVyLnN0YXJ0c1dpdGgoICIxLjMiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjdiA9IFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5WRVJTSU9OXzFfMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBqdm12ZXIuc3RhcnRzV2l0aCggIjEuNCIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgICAgcmN2ID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlZFUlNJT05fMV80OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGp2bXZlci5zdGFydHNXaXRoKCAiMS41IiApIHx8IGp2bXZlci5zdGFydHNXaXRoKCAiNS4wIiApICkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjdiA9IFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5WRVJTSU9OXzVfMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBqdm12ZXIuc3RhcnRzV2l0aCggIjEuNiIgKSB8fCBqdm12ZXIuc3RhcnRzV2l0aCggIjYuMCIgKSApIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB7Ci0gICAgICAgICAgICByY3YgPSBTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuVkVSU0lPTl82XzA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgICAgcmN2ID0gU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlZFUlNJT05fNl8wOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdm1JbnN0YWxsICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dCggU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlBST1BfVk1fSU5TVEFMTF9UWVBFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoIFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5QUk9QX1ZNX0lOU1RBTExfSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtSW5zdGFsbC5nZXRJZCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlci5jcmVhdGVSdW50aW1lQ29tcG9uZW50KCByY3YsIHByb3BlcnRpZXMgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldENvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0Q29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzdiYmMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0Q29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldENvcmVQbHVnaW4gCi0KLSAgICBleHRlbmRzIFBsdWdpbgotCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GT0xERVIgPSAib3V0cHV0Rm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RfUFJPUF9TT1VSQ0VfRk9MREVSX0xFR0FDWSA9ICJkZWZhdWx0U291cmNlIjsgLy8kTk9OLU5MUy0xJCAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRF9QUk9QX1NPVVJDRV9GT0xERVIgPSAiZGVmYXVsdEphdmFTb3VyY2VGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfRk9MREVSID0gInNyYyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBGYWNldENvcmVQbHVnaW4gaW5zdDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEZhY2V0Q29yZVBsdWdpbiBnZXREZWZhdWx0KCkgCi0gICAgewotICAgICAgICByZXR1cm4gaW5zdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZhY2V0Q29yZVBsdWdpbigpIHsKLSAgICAJc3VwZXIoKTsKLQkJaWYgKGluc3QgPT0gbnVsbCkKLQkJCWluc3QgPSB0aGlzOwotCX0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgCi0gICAgewotICAgICAgICByZXR1cm4gUExVR0lOX0lEOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBJTG9nIGxvZyA9IEZhY2V0Q29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiRW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24uIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgbG9nLmxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhU3JjRm9sZGVyKCl7Ci0gICAgCVN0cmluZyBzcmNGb2xkZXIgPSBGYWNldENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFBST0RfUFJPUF9TT1VSQ0VfRk9MREVSX0xFR0FDWSk7Ci0gICAgCWlmKCBzcmNGb2xkZXIgPT0gbnVsbCB8fCBzcmNGb2xkZXIuZXF1YWxzKCIiKSApeyAvLyROT04tTkxTLTEkCi0gICAgCQlpZiggUGxhdGZvcm0uZ2V0UHJvZHVjdCgpICE9IG51bGwgKXsKLSAgICAJCQlzcmNGb2xkZXIgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoIFBST0RfUFJPUF9TT1VSQ0VfRk9MREVSICk7Ci0gICAgCQkgICAgaWYoIHNyY0ZvbGRlciA9PSBudWxsIHx8IHNyY0ZvbGRlci5lcXVhbHMoIiIpKXsgLy8kTk9OLU5MUy0xJAotICAgIAkJICAgIAlzcmNGb2xkZXIgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoIFBST0RfUFJPUF9TT1VSQ0VfRk9MREVSX0xFR0FDWSApOwotICAgIAkJICAgIH0gICAgICAJCQkKLSAgICAJCX0KLQkgICAgCWlmKCBzcmNGb2xkZXIgPT0gbnVsbCB8fCBzcmNGb2xkZXIuZXF1YWxzKCIiKSApeyAvLyROT04tTkxTLTEkCi0JICAgIAkJc3JjRm9sZGVyID0gREVGQVVMVF9TT1VSQ0VfRk9MREVSOwotCSAgICAJfQotCi0gICAgCX0KLQkgICAgcmV0dXJuIHNyY0ZvbGRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRkY2JlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4gCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElMb2cgcGxhdGZvcm1Mb2cKLSAgICAgICAgPSBQbGF0Zm9ybS5nZXRMb2coIFBsYXRmb3JtLmdldEJ1bmRsZSggUExVR0lOX0lEICkgKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgKyAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBJU3RhdHVzIHN0YXR1cyApCi0gICAgewotICAgICAgICBwbGF0Zm9ybUxvZy5sb2coIHN0YXR1cyApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldERlZmF1bHRWZXJzaW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldERlZmF1bHRWZXJzaW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4MGE5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXREZWZhdWx0VmVyc2lvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlZmF1bHRWZXJzaW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogRGVmYXVsdHMgdGhlIGphdmEgZmFjZXQgdmVyc2lvbiB0byBhbGlnbiB3aXRoIHdvcmtzcGFjZSBqYXZhIGNvbXBpbGVyCi0gKiBsZXZlbCBzZXR0aW5ncy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldERlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLQotICAgIGltcGxlbWVudHMgSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLSAgICAKLXsKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBpbGVyTGV2ZWwgPSBKYXZhRmFjZXRVdGlsLmdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICAgICAgcmV0dXJuIEphdmFGYWNldFV0aWwuY29tcGlsZXJMZXZlbFRvRmFjZXQoIGNvbXBpbGVyTGV2ZWwgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXREZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwNDk0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFGYWNldERlbGVnYXRlIAotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUgCi0gICAgCi17Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWxldmFudEZpbGVzCi0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgSUZpbGUgZG90UHJvamVjdEZpbGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBJRmlsZSBkb3RDbGFzc3BhdGhGaWxlOwotICAgICAgICBwdWJsaWMgZmluYWwgSUZpbGUgamR0Q29yZVByZWZzRmlsZTsKLSAgICAgICAgcHVibGljIGZpbmFsIElGaWxlIGpzdEZhY2V0Q29yZVByZWZzRmlsZTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBSZWxldmFudEZpbGVzKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kb3RQcm9qZWN0RmlsZSA9IHByb2plY3QuZ2V0RmlsZSggIi5wcm9qZWN0IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0aGlzLmRvdENsYXNzcGF0aEZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICIuY2xhc3NwYXRoIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0aGlzLmpkdENvcmVQcmVmc0ZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHRoaXMuanN0RmFjZXRDb3JlUHJlZnNGaWxlID0gcHJvamVjdC5nZXRGaWxlKCAiLnNldHRpbmdzL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZWZzIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHZhbGlkYXRlRWRpdCggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdmFsaWRhdGVFZGl0KCBuZXcgUmVsZXZhbnRGaWxlcyggcHJvamVjdCApICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB2YWxpZGF0ZUVkaXQoIGZpbmFsIFJlbGV2YW50RmlsZXMgZmlsZXMgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SUZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoIGZpbGVzLmRvdFByb2plY3RGaWxlICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZmlsZXMuZG90Q2xhc3NwYXRoRmlsZS5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKCBmaWxlcy5kb3RDbGFzc3BhdGhGaWxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBmaWxlcy5qZHRDb3JlUHJlZnNGaWxlLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdC5hZGQoIGZpbGVzLmpkdENvcmVQcmVmc0ZpbGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGZpbGVzLmpzdEZhY2V0Q29yZVByZWZzRmlsZS5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKCBmaWxlcy5qc3RGYWNldENvcmVQcmVmc0ZpbGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElTdGF0dXMgdmFsaWRhdGVFZGl0U3RhdHVzIAotICAgICAgICAgICAgPSB3cy52YWxpZGF0ZUVkaXQoIGxpc3QudG9BcnJheSggbmV3IElGaWxlWyBsaXN0LnNpemUoKSBdICksIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUICk7Ci0gICAgICAgIAotICAgICAgICBpZiggdmFsaWRhdGVFZGl0U3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uIGUgCi0gICAgICAgICAgICAgICAgPSBuZXcgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFeGNlcHRpb24oIHZhbGlkYXRlRWRpdFN0YXR1cyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlLnNldEV4cGVjdGVkKCB0cnVlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxDb25maWdGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FkNmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxDb25maWdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uQ29uZmlnRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0ZhY3RvcnkKLQotICAgIGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkKLSAgICAKLXsKLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUzNDcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0SW5zdGFsbERlbGVnYXRlIAotCi0gICAgZXh0ZW5kcyBKYXZhRmFjZXREZWxlZ2F0ZSAKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHZhbGlkYXRlRWRpdCggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBjb25maWcgPSBjYXN0VG9Db25maWcoIGNmZyApOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgc291cmNlIGFuZCB0aGUgb3V0cHV0IGRpcmVjdG9yaWVzLgotCi0gICAgICAgIElKYXZhUHJvamVjdCBqcHJvamVjdCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiggcHJvamVjdC5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIGpwcm9qZWN0LmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGNwID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVBhdGggc3JjRm9sZGVyUGF0aCA6IGNvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIHNyY0ZvbGRlclBhdGggKTsKLSAgICAgICAgICAgICAgICBta2RpcnMoIGZvbGRlciwgZmFsc2UgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjcC5hZGQoIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElGb2xkZXIgZGVmT3V0cHV0Rm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIGNvbmZpZy5nZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCkgKTsKLSAgICAgICAgICAgIG1rZGlycyggZGVmT3V0cHV0Rm9sZGVyLCB0cnVlICk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgamF2YSBuYXR1cmUuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgYnVpbGRlci4KLQotICAgICAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gY3VycmVudCA9IGRlc2MuZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXBsYWNlbWVudCA9IG5ldyBTdHJpbmdbIGN1cnJlbnQubGVuZ3RoICsgMSBdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggY3VycmVudCwgMCwgcmVwbGFjZW1lbnQsIDAsIGN1cnJlbnQubGVuZ3RoICk7Ci0gICAgICAgICAgICByZXBsYWNlbWVudFsgY3VycmVudC5sZW5ndGggXSA9IEphdmFDb3JlLk5BVFVSRV9JRDsKLSAgICAgICAgICAgIGRlc2Muc2V0TmF0dXJlSWRzKCByZXBsYWNlbWVudCApOwotICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbiggZGVzYywgbnVsbCApOwotCi0gICAgICAgICAgICAvLyBTZXR1cCB0aGUgY2xhc3NwYXRoLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBqcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoIGNwLnRvQXJyYXkoIG5ldyBJQ2xhc3NwYXRoRW50cnlbIGNwLnNpemUoKSBdICksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZPdXRwdXRGb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCApOwotCi0gICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnJlc2V0Q2xhc3NwYXRoKCBwcm9qZWN0LCBudWxsLCBmdiApOwotICAgICAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBmdiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBjb21waWxlciBjb21wbGlhbmNlIGxldmVsIGZvciB0aGUgcHJvamVjdC4gSWdub3JlIHdoZXRoZXIKLSAgICAgICAgICAgIC8vIHRoaXMgbWlnaHQgYWxyZWFkeSBiZSBzZXQgc28gYXQgdGhlIHdvcmtzcGFjZSBsZXZlbCBpbiBjYXNlCi0gICAgICAgICAgICAvLyB3b3Jrc3BhY2Ugc2V0dGluZ3MgY2hhbmdlIGxhdGVyIG9yIHRoZSBwcm9qZWN0IGlzIGluY2x1ZGVkIGluIGEKLSAgICAgICAgICAgIC8vIGRpZmZlcmVudCB3b3Jrc3BhY2UuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBvbGRDb21waWxlckxldmVsID0gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnNldENvbXBpbGVyTGV2ZWwoIHByb2plY3QsIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBuZXdDb21waWxlckxldmVsID0gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZnVsbCBidWlsZCBvZiB0aGUgcHJvamVjdCBpZiB0aGUgY29tcGlsZXIgbGV2ZWwgY2hhbmdlZAotICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IGNsYXNzZXMgaW4gdGhlIHByb2plY3QgdG8gYmUgcmVjb21waWxlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG5ld0NvbXBpbGVyTGV2ZWwgIT0gbnVsbCAmJiAhIG5ld0NvbXBpbGVyTGV2ZWwuZXF1YWxzKCBvbGRDb21waWxlckxldmVsICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEphdmFGYWNldFV0aWwuc2NoZWR1bGVGdWxsQnVpbGQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGNhc3RUb0NvbmZpZyggZmluYWwgT2JqZWN0IGNmZyApCi0gICAgewotICAgICAgICBpZiggY2ZnIGluc3RhbmNlb2YgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgY2ZnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUFkYXB0ZXJNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotICAgICAgICAgICAgcmV0dXJuIChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBtYW5hZ2VyLmdldEFkYXB0ZXIoIGNmZywgSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWtkaXJzKCBmaW5hbCBJRm9sZGVyIGZvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Rlcml2ZWQgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCAhIGZvbGRlci5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb250YWluZXIgcGFyZW50ID0gZm9sZGVyLmdldFBhcmVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcGFyZW50IGluc3RhbmNlb2YgSUZvbGRlciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWtkaXJzKCAoSUZvbGRlcikgcGFyZW50LCBpc0Rlcml2ZWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9sZGVyLmNyZWF0ZSggdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAgICAgZm9sZGVyLnNldERlcml2ZWQoIGlzRGVyaXZlZCApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRSdW50aW1lQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmIxNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0UnVudGltZUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0UnVudGltZUNoYW5nZWRMaXN0ZW5lciAKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gZXZlbnQuZ2V0UHJvamVjdCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIGZwcm9qLmhhc1Byb2plY3RGYWNldCggSmF2YUZhY2V0LkZBQ0VUICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGZwcm9qLmdldEluc3RhbGxlZFZlcnNpb24oIEphdmFGYWNldC5GQUNFVCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnJlc2V0Q2xhc3NwYXRoKCBmcHJvai5nZXRQcm9qZWN0KCksIGZ2LCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtKYXZhUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4YzgwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldFVuaW5zdGFsbERlbGVnYXRlIAotCi0gICAgZXh0ZW5kcyBKYXZhRmFjZXREZWxlZ2F0ZSAKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFJlbGV2YW50RmlsZXMgZmlsZXMgPSBuZXcgUmVsZXZhbnRGaWxlcyggcHJvamVjdCApOwotCi0gICAgICAgIHZhbGlkYXRlRWRpdCggZmlsZXMgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEZpbmQgb3V0cHV0IGRpcmVjdG9yaWVzLiBUaGV5IHdpbGwgYmUgcmVtb3ZlZCBsYXRlci4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8SVBhdGg+IG91dHB1dEZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvdXRwdXRGb2xkZXJzLmFkZCgganByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElDbGFzc3BhdGhFbnRyeSBjcGUgOiBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVycy5hZGQoIGNwZS5nZXRPdXRwdXRMb2NhdGlvbigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBleGNlcHRpb24gc2luY2Ugd2UgdGVhcmluZyBkb3duIGFuZCB0aGUgdXNlciBtaWdodCBiZSBkb2luZyB0aGlzCi0gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBwcm9qZWN0IGlzIGNvcnJ1cHRlZC4KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gUmVtb3ZlIGphdmEgbmF0dXJlLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhlIGJ1aWxkZXIuCi0KLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBTdHJpbmcgbmF0dXJlIDogZGVzYy5nZXROYXR1cmVJZHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIG5hdHVyZS5lcXVhbHMoIEphdmFDb3JlLk5BVFVSRV9JRCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYXR1cmVzLmFkZCggbmF0dXJlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRlc2Muc2V0TmF0dXJlSWRzKCBuYXR1cmVzLnRvQXJyYXkoIG5ldyBTdHJpbmdbIG5hdHVyZXMuc2l6ZSgpIF0gKSApOwotICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKCBkZXNjLCBudWxsICk7Ci0KLSAgICAgICAgLy8gRGVsZXRlIHZhcmlvdXMgbWV0YWRhdGEgZmlsZXMuCi0gICAgICAgIAotICAgICAgICBmaWxlcy5kb3RDbGFzc3BhdGhGaWxlLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgICAgICBmaWxlcy5qZHRDb3JlUHJlZnNGaWxlLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgICAgICBmaWxlcy5qc3RGYWNldENvcmVQcmVmc0ZpbGUuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWxldGUgYWxsIHRoZSBvdXRwdXQgZm9sZGVycyBhbmQgdGhlaXIgY29udGVudHMuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUGF0aCBwYXRoIDogb3V0cHV0Rm9sZGVycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwYXRoICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlbGV0ZSggd3MuZ2V0Um9vdCgpLmdldEZvbGRlciggcGF0aCApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkZWxldGUoIGZpbmFsIElGb2xkZXIgZm9sZGVyICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJQ29udGFpbmVyIHBhcmVudCA9IGZvbGRlci5nZXRQYXJlbnQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBwYXJlbnQgaW5zdGFuY2VvZiBJRm9sZGVyICYmCi0gICAgICAgICAgICBwYXJlbnQubWVtYmVycyggSUNvbnRhaW5lci5JTkNMVURFX0hJRERFTiB8IElDb250YWluZXIuSU5DTFVERV9QSEFOVE9NUyB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb250YWluZXIuSU5DTFVERV9URUFNX1BSSVZBVEVfTUVNQkVSUyApLmxlbmd0aCA9PSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlKCAoSUZvbGRlcikgcGFyZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZm9sZGVyLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb2xkZXIuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkOTJiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldFV0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlckxldmVsKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBJbnN0YW5jZVNjb3BlKCk7Ci0gICAgICAgIGZpbmFsIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBjb250ZXh0LmdldE5vZGUoIEphdmFDb3JlLlBMVUdJTl9JRCApOwotICAgICAgICBTdHJpbmcgbGV2ZWwgPSBwcmVmcy5nZXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBsZXZlbCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSGFzaHRhYmxlIGRlZmF1bHRzID0gSmF2YUNvcmUuZ2V0RGVmYXVsdE9wdGlvbnMoKTsKLSAgICAgICAgICAgIGxldmVsID0gKFN0cmluZykgZGVmYXVsdHMuZ2V0KCBKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsZXZlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9qZWN0U2NvcGUoIHByb2plY3QgKTsKLSAgICAgICAgZmluYWwgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IGNvbnRleHQuZ2V0Tm9kZSggSmF2YUNvcmUuUExVR0lOX0lEICk7Ci0gICAgICAgIFN0cmluZyBsZXZlbCA9IHByZWZzLmdldCggSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGxldmVsID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZXZlbCA9IGdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxldmVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHNldENvbXBpbGVyTGV2ZWwoIHByb2plY3QsIGZhY2V0VG9Db21waWxlckxldmVsKCBmdiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBpbGVyTGV2ZWwoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVNjb3BlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2plY3RTY29wZSggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyAKLSAgICAgICAgICAgID0gY29udGV4dC5nZXROb2RlKCBKYXZhQ29yZS5QTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBsZXZlbC5lcXVhbHMoIEphdmFDb3JlLlZFUlNJT05fMV8zICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIEphdmFDb3JlLlZFUlNJT05fMV8zICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBKYXZhQ29yZS5WRVJTSU9OXzFfMSApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV8zICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSLCBKYXZhQ29yZS5JR05PUkUgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfRU5VTV9JREVOVElGSUVSLCBKYXZhQ29yZS5JR05PUkUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBsZXZlbC5lcXVhbHMoIEphdmFDb3JlLlZFUlNJT05fMV80ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIEphdmFDb3JlLlZFUlNJT05fMV80ICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBKYXZhQ29yZS5WRVJTSU9OXzFfMiApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV8zICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSLCBKYXZhQ29yZS5XQVJOSU5HICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0VOVU1fSURFTlRJRklFUiwgSmF2YUNvcmUuV0FSTklORyApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGxldmVsLmVxdWFscyggSmF2YUNvcmUuVkVSU0lPTl8xXzUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfQ09ERUdFTl9UQVJHRVRfUExBVEZPUk0sIEphdmFDb3JlLlZFUlNJT05fMV81ICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUgKTsKLSAgICAgICAgICAgIHByZWZzLnB1dCggSmF2YUNvcmUuQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIEphdmFDb3JlLkVSUk9SICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0VOVU1fSURFTlRJRklFUiwgSmF2YUNvcmUuRVJST1IgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBsZXZlbC5lcXVhbHMoIEphdmFDb3JlLlZFUlNJT05fMV82ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIEphdmFDb3JlLlZFUlNJT05fMV82ICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBKYXZhQ29yZS5WRVJTSU9OXzFfNiApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV82ICk7Ci0gICAgICAgICAgICBwcmVmcy5wdXQoIEphdmFDb3JlLkNPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSLCBKYXZhQ29yZS5FUlJPUiApOwotICAgICAgICAgICAgcHJlZnMucHV0KCBKYXZhQ29yZS5DT01QSUxFUl9QQl9FTlVNX0lERU5USUZJRVIsIEphdmFDb3JlLkVSUk9SICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZnMuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhpcy4KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NoZWR1bGVGdWxsQnVpbGQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIG1vZGVsZWQgYWZ0ZXIgdGhlIGNvZGUgaW4gCi0gICAgICAgIC8vIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS51dGlsLkNvcmVVdGlsaXR5LmdldEJ1aWxkSm9iKCkgbWV0aG9kLgotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuYnVpbGRpbmdNc2csIHByb2plY3QuZ2V0TmFtZSgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBKb2IgYnVpbGRKb2IgPSBuZXcgSm9iKCBtc2cgKSAKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgcnVuKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggbXNnLCAyICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmJ1aWxkKCBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoIG1vbml0b3IsIDEgKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgd3MuYnVpbGQoIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN1YlByb2dyZXNzTW9uaXRvciggbW9uaXRvciwgMSApICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyggZmluYWwgT2JqZWN0IGZhbWlseSApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkgPT0gUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgICAKLSAgICAgICAgYnVpbGRKb2Iuc2V0UnVsZSggd3MuZ2V0UnVsZUZhY3RvcnkoKS5idWlsZFJ1bGUoKSApOwotICAgICAgICBidWlsZEpvYi5zY2hlZHVsZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDbGFzc3BhdGgoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBvbGR2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBuZXd2ZXIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBvbGR2ZXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBvbGR2ZXIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBqYXZhIHByb2plY3QgYmVmb3JlIGl0IGJlY2FtZSBhIGZhY2V0ZWQgcHJvamVjdCBvcgotICAgICAgICAvLyB0aGUgSlJFIGNvbnRhaW5lciBoYXMgYmVlbiBhZGRlZCBtYW51YWxseSwgdGhlIGFib3ZlIG1ldGhvZCB3aWxsIG5vdAotICAgICAgICAvLyBkZWxldGUgdGhlIG9sZCBKUkUgY29udGFpbmVyLiBEbyBpdCBtYW51YWxseS4KLSAgICAgICAgCi0gICAgICAgIHJlbW92ZUpyZUNvbnRhaW5lciggcHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgaWYoICEgQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIG5ld3ZlciApICkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElWTUluc3RhbGwgdm0gPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB2bSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoIEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIgKTsKLSAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5hcHBlbmQoIHZtLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguYXBwZW5kKCB2bS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlIAotICAgICAgICAgICAgICAgICAgICA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KCBwYXRoICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdCBlbnRyaWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggY3BlICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIG5ld3ZlciwgZW50cmllcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlSnJlQ29udGFpbmVyKCBmaW5hbCBJUHJvamVjdCBwcm9qICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKCBwcm9qICk7Ci0gICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgcG9zID0gLTE7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwWyBpIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYKLSAgICAgICAgICAgICAgICBjcGUuZ2V0UGF0aCgpLnNlZ21lbnQoIDAgKS5lcXVhbHMoIEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIGlmKCBwb3MgPT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG5ld2NwIAotICAgICAgICAgICAgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WyBjcC5sZW5ndGggLSAxIF07Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBjcCwgMCwgbmV3Y3AsIDAsIHBvcyApOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBjcCwgcG9zICsgMSwgbmV3Y3AsIHBvcywgbmV3Y3AubGVuZ3RoIC0gcG9zICk7Ci0gICAgICAgIAotICAgICAgICBqcHJvai5zZXRSYXdDbGFzc3BhdGgoIG5ld2NwLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gY29tcGlsZXJMZXZlbFRvRmFjZXQoIGZpbmFsIFN0cmluZyB2ZXIgKQotICAgIHsKLSAgICAgICAgaWYoIHZlci5lcXVhbHMoICIxLjUiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBKYXZhRmFjZXQuSkFWQV81MDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB2ZXIuZXF1YWxzKCAgIjEuNiIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEphdmFGYWNldC5KQVZBXzYwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEphdmFGYWNldC5GQUNFVC5nZXRWZXJzaW9uKCB2ZXIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0VG9Db21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBpZiggZnYgPT0gSmF2YUZhY2V0LkpBVkFfNTAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YUNvcmUuVkVSU0lPTl8xXzU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZnYgPT0gSmF2YUZhY2V0LkpBVkFfNjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YUNvcmUuVkVSU0lPTl8xXzY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZnYuZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkaW5nTXNnOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggSmF2YUZhY2V0VXRpbC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFV0aWwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFV0aWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlMDBkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRVdGlsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZGluZ01zZyA9IEJ1aWxkaW5nIFByb2plY3QgezB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI4MzU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0VmFsaWRhdG9yCi0KLSAgICBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdFZhbGlkYXRvcgotICAgIAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRAotICAgICAgICA9ICJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5qYXZhVmVyc2lvbk1pc21hdGNoIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRkFDRVRfVkVSU0lPTiA9ICJmYWNldFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT01QSUxFUl9MRVZFTCA9ICJjb21waWxlckxldmVsIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCAKLSAgICAgICAgICAgID0gSmF2YUZhY2V0VXRpbC5nZXRDb21waWxlckxldmVsKCBmcHJvai5nZXRQcm9qZWN0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gZnByb2ouZ2V0SW5zdGFsbGVkVmVyc2lvbiggSmF2YUZhY2V0LkZBQ0VUICk7Ci0gICAgICAgIAotICAgICAgICBpZiggSmF2YUZhY2V0VXRpbC5jb21waWxlckxldmVsVG9GYWNldCggbGV2ZWwgKSAhPSBmdiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElNYXJrZXIgbWFya2VyCi0gICAgICAgICAgICAgICAgPSBmcHJvai5jcmVhdGVFcnJvck1hcmtlciggTUFSS0VSX0lELCBSZXNvdXJjZXMudmVyc2lvbnNEb250TWF0Y2ggKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZSggQVRUUl9GQUNFVF9WRVJTSU9OLCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoIEFUVFJfQ09NUElMRVJfTEVWRUwsIGxldmVsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbnNEb250TWF0Y2g7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBKYXZhRmFjZXRWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFZhbGlkYXRvci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0VmFsaWRhdG9yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMWU4NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YUZhY2V0VmFsaWRhdG9yLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi12ZXJzaW9uc0RvbnRNYXRjaCA9IEphdmEgY29tcGlsZXIgbGV2ZWwgZG9lcyBub3QgbWF0Y2ggdGhlIHZlcnNpb24gb2YgdGhlIGluc3RhbGxlZCBKYXZhIHByb2plY3QgZmFjZXQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9KYXZhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWNkZDIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSAKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRmluZCB0aGUgdmVyc2lvbiB0aGF0J3MgY3VycmVudGx5IGluc3RhbGxlZC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qCi0gICAgICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2plY3QgKTsKLQotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gb2xkdmVyCi0gICAgICAgICAgICAgICAgPSBmcHJvai5nZXRJbnN0YWxsZWRWZXJzaW9uKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZXNldCB0aGUgY2xhc3NwYXRoLiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSmF2YUZhY2V0VXRpbC5yZXNldENsYXNzcGF0aCggcHJvamVjdCwgb2xkdmVyLCBmdiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZXNldCB0aGUgY29tcGlsZXIgbGV2ZWwuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEphdmFGYWNldFV0aWwuc2V0Q29tcGlsZXJMZXZlbCggcHJvamVjdCwgZnYgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmdWxsIGJ1aWxkIG9mIHRoZSBwcm9qZWN0LgotICAgICAgICAgICAgCi0gICAgICAgICAgICBKYXZhRmFjZXRVdGlsLnNjaGVkdWxlRnVsbEJ1aWxkKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKCAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YVJ1bnRpbWVCcmlkZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0phdmFSdW50aW1lQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjdiYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvSmF2YVJ1bnRpbWVCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5TdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhUnVudGltZUJyaWRnZQotCi0gICAgaW1wbGVtZW50cyBJUnVudGltZUJyaWRnZQotICAgIAotewotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRFeHBvcnRlZFJ1bnRpbWVOYW1lcygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgOiBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCB2bUluc3RhbGwuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyBJU3R1YiBicmlkZ2UoIGZpbmFsIFN0cmluZyBuYW1lICkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElWTUluc3RhbGwgdm1JbnN0YWxsID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVZNSW5zdGFsbFR5cGUgdm1JbnN0YWxsVHlwZSA6IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2bUluc3RhbGwgPSB2bUluc3RhbGxUeXBlLmZpbmRWTUluc3RhbGxCeU5hbWUoIG5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHZtSW5zdGFsbCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBTdHViKCB2bUluc3RhbGwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHViCi0gICAgCi0gICAgICAgIGV4dGVuZHMgSVJ1bnRpbWVCcmlkZ2UuU3R1YgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSVZNSW5zdGFsbCB2bUluc3RhbGw7Ci0KLSAgICAgICAgcHVibGljIFN0dWIoIGZpbmFsIElWTUluc3RhbGwgdm1JbnN0YWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy52bUluc3RhbGwgPSB2bUluc3RhbGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYyA9IFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5jcmVhdGUoIHRoaXMudm1JbnN0YWxsICk7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggcmMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvcGVydGllcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDA5NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLQotICAgIGltcGxlbWVudHMgSUNsYXNzcGF0aFByb3ZpZGVyCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBJUnVudGltZSByOwotICAgIAotICAgIHB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoIGZpbmFsIElSdW50aW1lIHIgKQotICAgIHsKLSAgICAgICAgdGhpcy5yID0gcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRDbGFzc3BhdGhFbnRyaWVzKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IHRoaXMuci5nZXRSdW50aW1lQ29tcG9uZW50cygpLml0ZXJhdG9yKCk7IAotICAgICAgICAgICAgIGl0ci5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhQcm92aWRlciBjcHByb3YgCi0gICAgICAgICAgICAgICAgPSAoSUNsYXNzcGF0aFByb3ZpZGVyKSByYy5nZXRBZGFwdGVyKCBJQ2xhc3NwYXRoUHJvdmlkZXIuY2xhc3MgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNwcHJvdiAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGNwID0gY3Bwcm92LmdldENsYXNzcGF0aEVudHJpZXMoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGNwICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSUNsYXNzcGF0aFByb3ZpZGVyLmNsYXNzIH07Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGFkYXB0ZXJUeXBlID09IElDbGFzc3BhdGhQcm92aWRlci5jbGFzcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoIChJUnVudGltZSkgYWRhcHRhYmxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9TdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9TdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTg4M2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvU3RhbmRhcmRKcmVDbGFzc3BhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyIAotCi0gICAgaW1wbGVtZW50cyBJQ2xhc3NwYXRoUHJvdmlkZXIgCi0gICAgCi17Ci0JcHJpdmF0ZSBJUnVudGltZUNvbXBvbmVudCByYzsKLQotCXB1YmxpYyBTdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYyApIAotCXsKLQkJdGhpcy5yYyA9IHJjOwotCX0KLQotCXB1YmxpYyBMaXN0PElDbGFzc3BhdGhFbnRyeT4gZ2V0Q2xhc3NwYXRoRW50cmllcyggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKSAKLQl7Ci0JCWlmKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSA9PSBKYXZhRmFjZXQuRkFDRVQgKSAKLQkJewotCQkgICAgZmluYWwgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBnZXRWTUluc3RhbGwoKTsKLQkJICAgIAotCQkgICAgaWYoIHZtSW5zdGFsbCAhPSBudWxsICkKLQkJICAgIHsKLQkJICAgICAgICBmaW5hbCBJUGF0aCBjcEVudHJ5UGF0aCA9IEphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgoIHZtSW5zdGFsbCApOwotCQkgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcEVudHJ5ID0gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoIGNwRW50cnlQYXRoICk7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGNwRW50cnkgKTsKLQkJICAgIH0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKQotCXsKLQkgICAgZmluYWwgU3RyaW5nIHZtSW5zdGFsbFR5cGVJZCAKLQkgICAgICAgID0gdGhpcy5yYy5nZXRQcm9wZXJ0eSggU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlBST1BfVk1fSU5TVEFMTF9UWVBFICk7Ci0JICAgIAotCSAgICBmaW5hbCBTdHJpbmcgdm1JbnN0YWxsSWQKLQkgICAgICAgID0gdGhpcy5yYy5nZXRQcm9wZXJ0eSggU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlBST1BfVk1fSU5TVEFMTF9JRCApOwotCSAgICAKLQkgICAgaWYoIHZtSW5zdGFsbFR5cGVJZCA9PSBudWxsIHx8IHZtSW5zdGFsbElkID09IG51bGwgKQotCSAgICB7Ci0JICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQotCSAgICAKLQkgICAgZmluYWwgSVZNSW5zdGFsbFR5cGUgdm1JbnN0YWxsVHlwZSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoIHZtSW5zdGFsbFR5cGVJZCApOwotCSAgICAKLQkgICAgaWYoIHZtSW5zdGFsbFR5cGUgPT0gbnVsbCApCi0JICAgIHsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gdm1JbnN0YWxsVHlwZS5maW5kVk1JbnN0YWxsKCB2bUluc3RhbGxJZCApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotCQotCSAgICBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSAKLQkKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSUNsYXNzcGF0aFByb3ZpZGVyLmNsYXNzIH07Ci0KLQkJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSAKLQkJewotICAgICAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkgCi0JCXsKLQkJCUlSdW50aW1lQ29tcG9uZW50IHJjID0gKElSdW50aW1lQ29tcG9uZW50KSBhZGFwdGFibGU7Ci0JCQlyZXR1cm4gbmV3IFN0YW5kYXJkSnJlQ2xhc3NwYXRoUHJvdmlkZXIocmMpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM1ZTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmZDAxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MyNmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNXZWQgSmFuIDMxIDE1OjMyOjEyIFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZjRiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4zLjEucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGFlZWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmOWJjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQiPgotICA8ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci0gIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvamF2YS1mYWNldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9pbWFnZXMvamF2YS1mYWNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2I0ZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL2phdmEtZmFjZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL3N0YW5kYXJkLWpyZS1jb21wb25lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvaW1hZ2VzL3N0YW5kYXJkLWpyZS1jb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU1ZTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL2ltYWdlcy9zdGFuZGFyZC1qcmUtY29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTQ3MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBsdWdpbk5hbWUgPSBQcm9qZWN0IEZhY2V0IFVJIChKYXZhIFN1cHBvcnQpCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmRhYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIAotICAgICAgcnVudGltZS1jb21wb25lbnQtdHlwZT0ic3RhbmRhcmQuanJlIgotICAgICAgcGF0aD0iaW1hZ2VzL3N0YW5kYXJkLWpyZS1jb21wb25lbnQuZ2lmIi8+Ci0gICAgPGltYWdlIAotICAgICAgZmFjZXQ9ImpzdC5qYXZhIiAKLSAgICAgIHBhdGg9ImltYWdlcy9qYXZhLWZhY2V0LmdpZiIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24KLSAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgotCTxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCi0gICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5qYXZhVmVyc2lvbk1pc21hdGNoIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5KYXZhVmVyc2lvbk1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMiPgotICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJzdGFuZGFyZC5qcmUiLz4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuU3RhbmRhcmRKcmVDb21wb25lbnRMYWJlbFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvSmF2YVZlcnNpb25NaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0phdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjI1NGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvSmF2YVZlcnNpb25NaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkphdmFGYWNldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucwotCi0gICAgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgotICAgIAotewotICAgIHB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10gCi0gICAgICAgIHsgCi0gICAgICAgICAgICBuZXcgUmVzb2x1dGlvbjEoIG1hcmtlciApLCAKLSAgICAgICAgICAgIG5ldyBSZXNvbHV0aW9uMiggbWFya2VyICkgCi0gICAgICAgIH07Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc29sdXRpb24xCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIElNYXJrZXIgbWFya2VyOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFJlc29sdXRpb24xKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWFya2VyID0gbWFya2VyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy5jaGFuZ2VGYWNldFZlcnNpb24sIGZ2ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElNYXJrZXIgbWFya2VyICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbgotICAgICAgICAgICAgICAgID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLCBudWxsICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSB0aGlzLm1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qIAotICAgICAgICAgICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvaiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZwcm9qLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKCBudWxsLCBSZXNvdXJjZXMuZXJyb3JEaWFsb2dUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5lcnJvckRpYWxvZ01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCAKLSAgICAgICAgICAgICAgICA9IHRoaXMubWFya2VyLmdldEF0dHJpYnV0ZSggSmF2YUZhY2V0VmFsaWRhdG9yLkFUVFJfQ09NUElMRVJfTEVWRUwsIG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIEphdmFGYWNldFV0aWwuY29tcGlsZXJMZXZlbFRvRmFjZXQoIGxldmVsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvbHV0aW9uMgotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJTWFya2VyIG1hcmtlcjsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBSZXNvbHV0aW9uMiggZmluYWwgSU1hcmtlciBtYXJrZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1hcmtlciA9IG1hcmtlcjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCA9IGdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLmNoYW5nZUNvbXBpbGVyTGV2ZWwsIGxldmVsICk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCBmaW5hbCBJTWFya2VyIG1hcmtlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB0aGlzLm1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCA9IGdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBsZXZlbCApOwotICAgICAgICAgICAgICAgIEphdmFGYWNldFV0aWwuc2NoZWR1bGVGdWxsQnVpbGQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvciggbnVsbCwgUmVzb3VyY2VzLmVycm9yRGlhbG9nVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZXJyb3JEaWFsb2dNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRDb21waWxlckxldmVsKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZ2c3RyCi0gICAgICAgICAgICAgICAgPSB0aGlzLm1hcmtlci5nZXRBdHRyaWJ1dGUoIEphdmFGYWNldFZhbGlkYXRvci5BVFRSX0ZBQ0VUX1ZFUlNJT04sIG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IEphdmFGYWNldC5GQUNFVC5nZXRWZXJzaW9uKCBmdnN0ciApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5mYWNldFRvQ29tcGlsZXJMZXZlbCggZnYgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VGYWNldFZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZUNvbXBpbGVyTGV2ZWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nTWVzc2FnZTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEphdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvSmF2YVZlcnNpb25NaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL0phdmFWZXJzaW9uTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjdjYTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvaW50ZXJuYWwvSmF2YVZlcnNpb25NaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWNoYW5nZUZhY2V0VmVyc2lvbiA9IENoYW5nZSBKYXZhIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0byB7MH0KLWNoYW5nZUNvbXBpbGVyTGV2ZWwgPUNoYW5nZSBKYXZhIGNvbXBpbGVyIGxldmVsIHRvIHswfQotZXJyb3JEaWFsb2dUaXRsZSA9IEVycm9yCi1lcnJvckRpYWxvZ01lc3NhZ2UgPSBGYWlsZWQgd2hpbGUgYXBwbHlpbmcgdGhlIHF1aWNrIGZpeC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1N0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9TdGFuZGFyZEpyZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5NzFjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1N0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGFuZGFyZEpyZUNvbXBvbmVudExhYmVsUHJvdmlkZXIgCi0KLSAgICBpbXBsZW1lbnRzIElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciAKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjOwotCi0gICAgcHVibGljIFN0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlciggZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMgKSAKLSAgICB7Ci0gICAgICAgIHRoaXMucmMgPSByYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgCi0gICAgewotICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ID0gdGhpcy5yYy5nZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpOwotICAgICAgICByZXR1cm4gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5sYWJlbCwgcmN2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5jbGFzcyB9OwotCi0gICAgICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGVPYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZEpyZUNvbXBvbmVudExhYmVsUHJvdmlkZXIoIChJUnVudGltZUNvbXBvbmVudCkgYWRhcHRhYmxlT2JqZWN0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBTdGFuZGFyZEpyZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1N0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9pbnRlcm5hbC9TdGFuZGFyZEpyZUNvbXBvbmVudExhYmVsUHJvdmlkZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0OWVmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L3VpL2ludGVybmFsL1N0YW5kYXJkSnJlQ29tcG9uZW50TGFiZWxQcm92aWRlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbGFiZWwgPSBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgdnswfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMmZiMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotZmFjZXQtY29yZS5qYXIKLXRlbXAuZm9sZGVyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MjEyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9kZWxlZ2F0ZS9jYWxscyA9IGZhbHNlCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9hY3Rpb25Tb3J0aW5nID0gZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2FjdGl2YXRpb24gPSBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTllNWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MyNmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1dlZCBKYW4gMzEgMTU6MzI6MTIgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0Mzc0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMTAwLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSxvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGU1MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWFzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MWU0ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQiPgotICA8ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci0gIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTUwYTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBsdWdpbk5hbWUgPSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1idWlsZGVyTmFtZSA9IEZhY2V0ZWQgUHJvamVjdCBWYWxpZGF0aW9uIEJ1aWxkZXIKLXZhbGlkYXRpb25NYXJrZXJOYW1lID0gRmFjZXRlZCBQcm9qZWN0IFByb2JsZW0KLWV4dFBvaW50TGlzdGVuZXJzID0gRmFjZXRlZCBQcm9qZWN0IExpc3RlbmVycyBFeHRlbnNpb24gUG9pbnQKLWV4dFBvaW50UHJlc2V0cyA9IEZhY2V0ZWQgUHJvamVjdCBQcmVzZXRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWY3ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uLXBvaW50IAotICAgIGlkPSJmYWNldHMiCi0gICAgbmFtZT0iUHJvamVjdCBGYWNldHMgRXh0ZW5zaW9uIFBvaW50IgotICAgIHNjaGVtYT0ic2NoZW1hcy9mYWNldHMuZXhzZCIvPgotCi0gIDxleHRlbnNpb24tcG9pbnQgCi0gICAgaWQ9InJ1bnRpbWVzIgotICAgIG5hbWU9IlJ1bnRpbWVzIEV4dGVuc2lvbiBQb2ludCIKLSAgICBzY2hlbWE9InNjaGVtYXMvcnVudGltZXMuZXhzZCIvPgotCi0gIDxleHRlbnNpb24tcG9pbnQgCi0gICAgaWQ9InJ1bnRpbWVCcmlkZ2VzIgotICAgIG5hbWU9IlJ1bnRpbWUgQnJpZGdlcyBFeHRlbnNpb24gUG9pbnQiCi0gICAgc2NoZW1hPSJzY2hlbWFzL3J1bnRpbWVCcmlkZ2VzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uLXBvaW50IAotICAgIGlkPSJkZWZhdWx0RmFjZXRzIgotICAgIG5hbWU9IkRlZmF1bHQgRmFjZXRzIEV4dGVuc2lvbiBQb2ludCIKLSAgICBzY2hlbWE9InNjaGVtYXMvZGVmYXVsdEZhY2V0cy5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbi1wb2ludCAKLSAgICBpZD0idmFsaWRhdG9ycyIKLSAgICBuYW1lPSJGYWNldGVkIFByb2plY3QgVmFsaWRhdG9ycyBFeHRlbnNpb24gUG9pbnQiCi0gICAgc2NoZW1hPSJzY2hlbWFzL3ZhbGlkYXRvcnMuZXhzZCIvPgotICAgIAotICA8ZXh0ZW5zaW9uLXBvaW50IAotICAgIGlkPSJsaXN0ZW5lcnMiIAotICAgIG5hbWU9IiVleHRQb2ludExpc3RlbmVycyIgCi0gICAgc2NoZW1hPSJzY2hlbWFzL2xpc3RlbmVycy5leHNkIi8+Ci0gICAgCi0gIDxleHRlbnNpb24tcG9pbnQgCi0gICAgaWQ9InByZXNldHMiIAotICAgIG5hbWU9IiVleHRQb2ludFByZXNldHMiIAotICAgIHNjaGVtYT0ic2NoZW1hcy9wcmVzZXRzLmV4c2QiLz4KLSAgCi0gIDxleHRlbnNpb24KLSAgICBpZD0ibmF0dXJlIgotICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIj4KLSAgICA8cnVudGltZT4KLSAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0TmF0dXJlIi8+Ci0gICAgPC9ydW50aW1lPgotICAgIDxidWlsZGVyIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5idWlsZGVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgIGlkPSJidWlsZGVyIgotICAgIG5hbWU9IiVidWlsZGVyTmFtZSIKLSAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuYnVpbGRlcnMiPgotICAgIDxidWlsZGVyIGhhc05hdHVyZT0idHJ1ZSI+Ci0gICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdFZhbGlkYXRpb25CdWlsZGVyIi8+Ci0gICAgPC9idWlsZGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gCi0gICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiCi0gICAgaWQ9InZhbGlkYXRpb24ubWFya2VyIgotICAgIG5hbWU9IiV2YWxpZGF0aW9uTWFya2VyTmFtZSI+Ci0gICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiLz4KLSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RBZGFwdGVyIiAKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdCIvPgotICAgIDwvZmFjdG9yeT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIgotICAgICAgcHJvcGVydGllcz0icHJvamVjdEZhY2V0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIiPgotICAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0cyI+Ci0gICAgPGR5bmFtaWMtcHJlc2V0IGlkPSJkZWZhdWx0LmNvbmZpZ3VyYXRpb24iPgotICAgICAgPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkRlZmF1bHRDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeSIvPgotICAgIDwvZHluYW1pYy1wcmVzZXQ+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHMiPgotICAgIDxkeW5hbWljLXByZXNldCBpZD0ibWluaW1hbC5jb25maWd1cmF0aW9uIj4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5NaW5pbWFsQ29uZmlndXJhdGlvblByZXNldEZhY3RvcnkiLz4KLSAgICA8L2R5bmFtaWMtcHJlc2V0PgotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9kZWZhdWx0RmFjZXRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvZGVmYXVsdEZhY2V0cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc0NGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9kZWZhdWx0RmFjZXRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBpZD0iZGVmYXVsdEZhY2V0cyIgbmFtZT0iRGVmYXVsdCBGYWNldHMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSB3aGljaCBmYWNldHMgKGFuZCB3aGljaCB2ZXJzaW9ucyBvZiB0aG9zZSBmYWNldHMpIHNob3VsZCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgYSBwcm9qZWN0LiBUaGUgb3B0aW9uYWwgY29udGV4dCBlbGVtZW50IGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gY29udHJvbCB0aGUgc2l0dWF0aW9ucyB3aGVuIHRoZSBwcm92aWRlZCBmYWNldHMgc2hvdWxkIGJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIFRoZSBjb250ZXh0IGNhbiByZXN0cmljdCBhcHBsaWNhYmlsaXR5IHRvIHNwZWNpZmljIHJ1bnRpbWUgdHlwZXMgYW5kL29yIHNwZWNpZmljIGZpeGVkIGZhY2V0cy4gSWYgbXVsdGlwbGUgZXh0ZW5zaW9ucyBhcmUgYXBwbGljYWJsZSBpbiBhIGdpdmVuIHNpdHVhdGlvbnMsIHRoZSBmYWNldHMgc3BlY2lmaWVkIGluIHRoZXNlIGV4dGVuc2lvbnMgd2lsbCBiZSBtZXJnZWQgdG8gZm9ybSBhIHVuaWZpZWQgZGVmYXVsdCBjb25maWd1cmF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIChubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZWZhdWx0LWZhY2V0cyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZWZhdWx0LWZhY2V0cyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZXh0ZW5zaW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZXh0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lLWNvbXBvbmVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWNldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWUtY29tcG9uZW50Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIHRoZSBwcmltYXJ5IHRhcmdldGVkIHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0IGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBydW50aW1lIGNvbXBvbmVudCBvZiBzcGVjaWZpZWQgdHlwZSBpbiBvcmRlciBmb3IgdGhlc2UgZGVmYXVsdCBmYWNldHMgdG8gYXBwbHkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFJ1bnRpbWUgY29tcG9uZW50IHR5cGUgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG1hdGNoIGV4cHJlc3Npb24gZm9yIHRoZSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uLiBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gJnF1b3Q7Mi4yLDIuNSxbMy4wLTUuM10sKDcuMyZxdW90Oywgd2hlcmUgdGhlIGNvbWFzIGZ1bmN0aW9uIGFzIGFuIE9SLiBCcmFja2V0cyBhbmQgcGFyZW50aGVzaXMgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcmFuZ2Ugbm90YXRpb24uIEEgYnJhY2tldCBtZWFucyBpbmNsdXNpdmUgd2hpbGUgYSBwYXJlbnRoZXNpcyBtZWFucyBleGNsdXNpdmUuIElmIHRoZSB2ZXJzaW9uIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCBhbnkgdmVyc2lvbiB3aWxsIHNhdGlzZnkgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBwcm9qZWN0IGZhY2V0IGlkIGFuZCB2ZXJzaW9uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwcm9qZWN0IGZhY2V0IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGV4dCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVzY3JpYmVzIHRoZSBzaXR1YXRpb24gd2hlbiB0aGUgc3BlY2lmaWVkIGZhY2V0cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQgc2V0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lLWNvbXBvbmVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaXhlZC1mYWNldCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpeGVkLWZhY2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BlY2lmaWVkIGZhY2V0IG5lZWRzIHRvIGJlIG9uZSBvZiB0aGUgcHJvamVjdCZhcG9zO3MgZml4ZWQgZmFjZXRzIGluIG9yZGVyIGZvciB0aGVzZSBkZWZhdWx0IGZhY2V0cyB0byBhcHBseS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBmaXhlZCBmYWNldC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDtUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVjbGFyZXMgZmFjZXQxICh2ZXJzaW9uIDEuMykgYW5kIGZhY2V0MiAodmVyc2lvbiA1LjApIGFzIGRlZmF1bHQgZmFjZXRzIGZvciBydW50aW1lIGNvbXBvbmVudCBNeVJ1bnRpbWVDb21wb25lbnQuJmx0Oy9wJmd0OyAKLQotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyZxdW90OyZndDsKLSAgJmx0O2RlZmF1bHQtZmFjZXRzJmd0OwotICAgICZsdDtjb250ZXh0Jmd0OwotICAgICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGlkPSZxdW90O015UnVudGltZUNvbXBvbmVudCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9jb250ZXh0Jmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtmYWNldDEmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjMmcXVvdDsvJmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtmYWNldDImcXVvdDsgdmVyc2lvbj0mcXVvdDs1LjAmcXVvdDsvJmd0OwotICAmbHQ7L2RlZmF1bHQtZmFjZXRzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLQotJmx0O3AmZ3Q7TXVsdGlwbGUgcGx1Z2lucyBjYW4gY29udHJpYnV0ZSB0byB0aGUgc2V0IG9mIHRoZSBkZWZhdWx0IGZhY2V0cyBmb3IgYSBnaXZlbiBydW50aW1lIGNvbXBvbmVudC4gSWYgdGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIGNvbWJpbmVkIHdpdGggdGhlIGZpcnN0IG9uZSwgdGhlcmUgd2lsbCBiZSB0aHJlZSBkZWZhdWx0IGZhY2V0cyBhc3NvY2lhdGVkIHdpdGggTXlSdW50aW1lQ29tcG9uZW50LiZsdDsvcCZndDsKLQotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyZxdW90OyZndDsKLSAgJmx0O2RlZmF1bHQtZmFjZXRzJmd0OwotICAgICZsdDtjb250ZXh0Jmd0OwotICAgICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGlkPSZxdW90O015UnVudGltZUNvbXBvbmVudCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9jb250ZXh0Jmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtmYWNldDMmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjImcXVvdDsvJmd0OwotICAmbHQ7L2RlZmF1bHQtZmFjZXRzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLQotJmx0O3AmZ3Q7RnVydGhlciBjb250ZXh0IGluZm9ybWF0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdG8gY29udHJvbCB3aGVuIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBmYWNldHMgc2hvdWxkIGJlIHVzZWQuIENvbnNpZGVyIHRoZSBzaXR1YXRpb24gd2hlcmUgYSBwYXJ0aWN1bGFyIGZhY2V0IHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUgKGFzIHJlcHJlc2VudGVkIGJ5IGZpeGVkIGZhY2V0cykuIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZmFjZXQ0IHdpbGwgYmUgb25seSBlbmFibGVkIGJ5IGRlZmF1bHQgaWYgb25lIG9mIHRoZSBwcm9qZWN0JmFwb3M7cyBmaXhlZCBmYWNldHMgaXMgZml4ZWQuZmFjZXQxLiZsdDsvcCZndDsKLQotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyZxdW90OyZndDsKLSAgJmx0O2RlZmF1bHQtZmFjZXRzJmd0OwotICAgICZsdDtjb250ZXh0Jmd0OwotICAgICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGlkPSZxdW90O015UnVudGltZUNvbXBvbmVudCZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7Zml4ZWQtZmFjZXQgaWQ9JnF1b3Q7Zml4ZWQuZmFjZXQxJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2NvbnRleHQmZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSZxdW90O2ZhY2V0NCZxdW90OyB2ZXJzaW9uPSZxdW90OzEuMCZxdW90Oy8mZ3Q7Ci0gICZsdDsvZGVmYXVsdC1mYWNldHMmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9mYWNldHMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9mYWNldHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExNzU3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvZmFjZXRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIGlkPSJmYWNldHMiIG5hbWU9IlByb2plY3QgRmFjZXRzIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIHRoZSBtYWluIGV4dGVuc2lvbiBwb2ludCBpbiB0aGUgZmFjZXRlZCBwcm9qZWN0IGZyYW1ld29yay4gSXQgaXMgdXNlZCBmb3IgZGVmaW5pbmcgcHJvamVjdCBmYWNldHMuIEEgcHJvamVjdCBmYWNldCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSB1c2VyIGNhbiBhZGQgdG8gdGhlIHByb2plY3Qgd2hlbiB0aGUgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3QtZmFjZXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdC1mYWNldC12ZXJzaW9uIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByZXNldCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0ZW1wbGF0ZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3Rpb24iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXZlbnQtaGFuZGxlciIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJncm91cCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBsb2NhbGl6YWJsZSBuYW1lIHRoYXQgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaWQgd2lsbCBiZSB1c2VkIGZvciBhIGxhYmVsLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdGV4dC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYW5kIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIGZhY2V0IGNvbnN0cmFpbnQgb3BlcmF0b3IgdGhhdCBwZXJmb3JtcyBhIGNvbmp1bmN0aW9uIG92ZXIgdGhlIHJlc3VsdHMgb2YgZXZhbHVhdGlvbiBvZiB0d28gb3IgbW9yZSBzdWItZXhwcmVzc2lvbnMuIFRoaXMgb3BlcmF0b3Igd2lsbCByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiBhbGwgc3ViLWV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIHRydWUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbmQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3IiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVxdWlyZXMiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29uZmxpY3RzIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBIGZhY2V0IGNvbnN0cmFpbnQgb3BlcmF0b3IgdGhhdCBwZXJmb3JtcyBhIGRpc2p1bmN0aW9uIG92ZXIgdGhlIHJlc3VsdHMgb2YgZXZhbHVhdGlvbiBvZiB0d28gb3IgbW9yZSBzdWItZXhwcmVzc2lvbnMuIFRoaXMgb3BlcmF0b3Igd2lsbCByZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHN1Yi1leHByZXNzaW9ucyBldmFsdWF0ZSB0byB0cnVlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlcXVpcmVzIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbmZsaWN0cyIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXF1aXJlcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBmYWNldCBjb25zdHJhaW50IG9wZXJhdG9yIHRoYXQgaXMgdXNlZCB0byBkZWNsYXJlIGEgZGVwZW5kZW5jeSBvZiBvbmUgZmFjZXQgb24gYW5vdGhlciBmYWNldCBvciBhbnkgbWVtYmVyIG9mIGEgZ3JvdXAgb2YgZmFjZXRzLiBUaGlzIG9wZXJhdG9yIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkLiBOb3RlIHRoYXQgdGhlIGdyb3VwIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmFjZXQgYW5kIHZlcnNpb24gYXR0cmlidXRlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3JvdXAiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBmYWNldCBncm91cCB0aGF0IHRoaXMgZmFjZXQgaXMgZGVjbGFyaW5nIGEgZGVwZW5kZW5jeSBvbi4gQW55IG1lbWJlciBvZiB0aGUgZ3JvdXAgd2lsbCBzYXRpc2Z5IHRoZSBkZXBlbmRlbmN5LiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZmFjZXQgYW5kIHZlcnNpb24gYXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGZhY2V0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtYXRjaCBleHByZXNzaW9uIGZvciB0aGUgZmFjZXQgdmVyc2lvbi4gVGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNvZnQiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHNldCB0byB0cnVlIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBzb2Z0IGRlcGVuZGVuY3kuIEEgc29mdCBkZXBlbmRlbmN5IHdpbGwgbm90IHByZXZlbnQgdGhlIGZhY2V0IGZyb20gYmVpbmcgaW5zdGFsbGVkIGlmIGl0IGlzIG5vdCBtZXQuIFRoZSBwdXJwb3NlIG9mIHNwZWNpZnlpbmcgYSBzb2Z0IGRlcGVuZGVuY3kgaXMgdG8gY29udHJvbCBmYWNldCBpbnN0YWxsYXRpb24gb3JkZXIuIElmIGZhY2V0IEEgZGVjbGFyZXMgYSBzb2Z0IGRlcGVuZGVuY3kgb24gZmFjZXQgQiwgZmFjZXQgQSBpcyBndWFyYW50ZWVkIHRvIGJlIGluc3RhbGxlZCBhZnRlciBCIGhhcyBiZWVuIGluc3RhbGxlZCAoYXNzdW1pbmcgQiBpcyBzZWxlY3RlZCkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbmZsaWN0cyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQSBmYWNldCBjb25zdHJhaW50IG9wZXJhdG9yIHRoYXQgaXMgdXNlZCB0byBkZWNsYXJlIGEgY29uZmxpY3QgYmV0d2VlbiB0aGlzIGZhY2V0IGFuZCBhbm90aGVyIGZhY2V0IG9yIHRoaXMgZmFjZXQgYW5kIGEgZ3JvdXAgb2YgZmFjZXRzLiBUaGlzIG9wZXJhdG9yIHdpbGwgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGNvbmZsaWN0IGlzIG5vdCBwcmVzZW50LiBOb3RlIHRoYXQgdGhlIGdyb3VwIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmFjZXQgYW5kIHZlcnNpb24gYXR0cmlidXRlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3JvdXAiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBmYWNldCBncm91cCB0aGF0IHRoaXMgZmFjZXQgY29uZmxpY3RzIHdpdGguIE5vdGUgdGhhdCBpdCBpcyBzYWZlIGZvciB0aGUgZGVjbGFyaW5nIGZhY2V0IHRvIGJlIGEgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuIENvbmZsaWN0cyBiZXR3ZWVuIHRoZSBmYWNldCBhbmQgaXRzZWxmIGFyZSBpZ25vcmVkLiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZmFjZXQgYW5kIHZlcnNpb24gYXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGZhY2V0IHRoYXQgdGhpcyBmYWNldCBjb25mbGljdHMgd2l0aC4gSWYgdGhlIHZlcnNpb24gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGNvbmZsaWN0IGRlY2xhcmF0aW9uIHdpbGwgYmUgbGltaXRlZCB0byB0aG9zZSB2ZXJzaW9ucyBjb3ZlcmVkIGJ5IHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGZhY2V0IGF0dHJpYnV0ZSB0byBsaW1pdCB0aGUgdmVyc2lvbnMgY292ZXJlZCBieSB0aGUgY29uZmxpY3QgZGVjbGFyYXRpb24uIFRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb25zdHJhaW50Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGNvbnN0cmFpbnQgdGhhdCBoYXMgdG8gYmUgc2F0aXNmaWVkIGJlZm9yZSB0aGlzIGZhY2V0IGNhbiBiZSBpbnN0YWxsZWQgaW4gYSBwcm9qZWN0LiBBIGNvbnN0cmFpbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgZmFjZXRzIGFzIHdlbGwgYXMgY29uZmxpY3RzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5kIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlcXVpcmVzIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbmZsaWN0cyIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJncm91cC1tZW1iZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIE1ha2VzIHRoaXMgZmFjZXQgYSBtZW1iZXIgb2YgdGhlIGdyb3VwIHNwZWNpZmllZCBpbiB0aGUgaWQgYXR0cmlidXRlLiBBIGZhY2V0IGNhbiBiZSBhIG1lbWJlciBvZiBhbnkgbnVtYmVyIG9mIGdyb3Vwcy4gR3JvdXBzIGFyZSBhdXRvLWNyZWF0ZWQgd2hlbiByZWZlcmVuY2VkIGJ5IHRoaXMgZXh0ZW5zaW9uIHBvaW50LiBUaGUgZmFjZXQgZ3JvdXBzIGFyZSBwcmltYXJpbHkgdXNlZCB3aGVuIHNwZWNpZnlpbmcgY29uZmxpY3QgY29uc3RyYWludHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgZmFjZXQgZ3JvdXAgdG8gYWRkIHRoaXMgZmFjZXQgdG8uIEdyb3VwcyBhcmUgYXV0by1jcmVhdGVkIHdoZW4gcmVmZXJlbmNlZCBieSB0aGlzIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvamVjdC1mYWNldCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBwcm9qZWN0IGZhY2V0LiBBIHByb2plY3QgZmFjZXQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgdGhhdCB0aGUgdXNlciBjYW4gYWRkIHRvIHRoZSBwcm9qZWN0IHdoZW4gdGhlIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkLiBOb3RlIHRoYXQgYSBmYWNldCBuZWVkIHRvIGhhdmUgYSBsZWFzdCBvbmUgdmVyc2lvbiBkZWNsYXJlZCBpbiBvcmRlciB0byBiZSB1c2VmdWwuIFNlZSBwcm9qZWN0LWZhY2V0LXZlcnNpb24gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGFiZWwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2ZXJzaW9uLWNvbXBhcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlZmF1bHQtdmVyc2lvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWVtYmVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgUHJvamVjdCBmYWNldCBpZGVudGlmaWVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9qZWN0LWZhY2V0LXZlcnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgcHJvamVjdCBmYWNldCB2ZXJzaW9uLiBFYWNoIGZhY2V0IG5lZWRzIHRvIGhhdmUgYXQgbGVhcyBvbmUgdmVyc2lvbiBkZWNsYXJlZCBpbiBvcmRlciB0byBiZSB1c2VmdWwuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imdyb3VwLW1lbWJlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXZlbnQtaGFuZGxlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBpcyBhIHZlcnNpb24gb2YuIFRoZSBmYWNldCBpdHNlbGYgbmVlZHMgdG8gYmUgZGVjbGFyZWQgdXNpbmcgdGhlIHByb2plY3QtZmFjZXQgZWxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2ZXJzaW9uIHN0cmluZy4gSGFzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBjb21wYXJhdG9yIHNwZWNpZmllZCBmb3IgdGhpcyBmYWNldCBvciB1c2UgdGhlIHN0YW5kYXJkIGRlY2ltYWwgdmVyc2lvbiBub3RhdGlvbiAoaS5lLiAxLjIzLjAwNSkgaWYgdGhlIGZhY2V0IGRvZXMgbm90IHNwZWNpZnkgYSBjdXN0b20gdmVyc2lvbiBjb21wYXJhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uLWNvbXBhcmF0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdmVyc2lvbiBjb21wYXJhdG9yIGZvciB0aGlzIHByb2plY3QgZmFjZXQuIElmIG5vIHZlcnNpb24gY29tcGFyYXRvciBpcyBzcGVjaWZpZWQgdGhlIGRlZmF1bHQgY29tcGFyYXRvciB3aWxsIGJlIHVzZWQuIFRoZSBkZWZhdWx0IHZlcnNpb24gY29tcGFyYXRvciBjYW4gaGFuZGxlIHZlcnNpb25zIHRoYXQgYXJlIHdyaXR0ZW4gaW4gc3RhbmRhcmQgZGVjaW1hbCBub3RhdGlvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gY29tcGFyYXRvciBjbGFzcyBuYW1lLiBIYXMgdG8gaW1wbGVtZW50IGphdmEudXRpbC5Db21wYXJhdG9yJmFtcDtsdDtTdHJpbmcmYW1wO2d0OyBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqYXZhLnV0aWwuQ29tcGFyYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBwcm9qZWN0IGZhY2V0cyBjYXRlZ29yeS4gQ2F0ZWdvcmllcyBhcmUgZ3JvdXBzIG9mIGZhY2V0cyB0aGF0IHRoZSB1c2VyIHdpbGwgdHlwaWNhbGx5IHdhbnQgdG8gYWRkIG9yIHJlbW92ZSBhcyBhIHNldC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGFiZWwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNhdGVnb3J5IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcmVzZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIHByZXNldC4gQSBwcmVzZXQgcmVwcmVzZW50cyBhIGNvbW1vbiBjb25maWd1cmF0aW9uIG9mIGZhY2V0cyBhbmQgdGhlaXIgdmVyc2lvbnMgdGhhdCBhIHVzZXIgbWlnaHQgd2FudCB0byB1dGlsaXplIG9uIHNldmVyYWwgcHJvamVjdHMuIFByZXNldHMgY2FuIGJlIHN1cHBsaWVkIHZpYSB0aGlzIGV4dGVuc2lvbiBwb2ludCBvciBjcmVhdGVkIGJ5IHRoZSB1c2VyLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsYWJlbCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwcmVzZXQgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRlbXBsYXRlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIHRlbXBsYXRlLiBBIHRlbXBsYXRlIGlzIHNpbXBseSBhIGNvbWJpbmF0aW9uIG9mIGZpeGVkIGZhY2V0cyBhbmQgYW4gb3B0aW9uYWwgcHJlc2V0LiBUZW1wbGF0ZXMgYXJlIHVzZWQgYXMgYSBndWlkZSB3aGVuIGNyZWF0aW9uIHByb2plY3RzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsYWJlbCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaXhlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcmVzZXQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0ZW1wbGF0ZSBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZml4ZWQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWNldCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWN0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBQcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBhbiBhY3Rpb24sIHN1Y2ggYXMgaW5zdGFsbCBvciB1bmluc3RhbGwsIHRoYXQgYSB1c2VyIGNhbiB0YWtlIG9uIGEgcHJvamVjdCBmYWNldC4gQW55IGFjdGlvbiB0aGF0JmFwb3M7cyBub3QgaW1wbGVtZW50ZWQgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyLiBUaGUgYWN0aW9uIGVsZW1lbnQgY2FuIGJlIHVzZWQgc3RhbmRhbG9uZSBvciBlbWJlZGVkIGluc2lkZSB0aGUgcHJvamVjdC1mYWNldC12ZXJzaW9uIGVsZW1lbnQuIElmIHVzZWQgaW5zaWRlIHRoZSBwcm9qZWN0LWZhY2V0LXZlcnNpb24gZWxlbWVudCwgdGhlIGZhY2V0IGFuZCB2ZXJzaW9uIGF0dHJpYnV0ZXMgYXJlIGltcGxpZWQgYW5kIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb25maWctZmFjdG9yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVsZWdhdGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFjdGlvbiB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaW5zdGFsbCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ1bmluc3RhbGwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0idmVyc2lvbi1jaGFuZ2UiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0icnVudGltZS1jaGFuZ2VkIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOU1RBTEwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVU5JTlNUQUxMIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ0hBTkdFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgYWN0aW9uIGFwcGxpZXMgdG8uIFRoaXMgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGVtYmVkaW5nIHRoZSBhY3Rpb24gZWxlbWVudCBpbnNpZGUgdGhlIHByb2plY3QtZmFjZXQtdmVyc2lvbiBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgZmFjZXQgdGhhdCB0aGlzIGFjdGlvbiBhcHBsaWVzIHRvLiBNdWx0aXBsZSB2ZXJzaW9ucyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHZlcnNpb24gZXhwcmVzc2lvbiBzeW50YXguIFRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtICZxdW90OzIuMiwyLjUsWzMuMC01LjNdLCg3LjMmcXVvdDssIHdoZXJlIHRoZSBjb21hcyBmdW5jdGlvbiBhcyBhbiBPUi4gQnJhY2tldHMgYW5kIHBhcmVudGhlc2lzIGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHJhbmdlIG5vdGF0aW9uLiBBIGJyYWNrZXQgbWVhbnMgaW5jbHVzaXZlIHdoaWxlIGEgcGFyZW50aGVzaXMgbWVhbnMgZXhjbHVzaXZlLiBUaGlzIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBlbWJlZGluZyB0aGUgYWN0aW9uIGVsZW1lbnQgaW5zaWRlIHRoZSBwcm9qZWN0LWZhY2V0LXZlcnNpb24gZWxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgYWN0aW9uIGlkLiBJZiBub3Qgc3BlY2lmaWVkLCBhIGRlZmF1bHQgaWQgd2lsbCBiZSBhc3NpZ25lZCB1c2luZyB0aGUgJnF1b3Q7W2ZhY2V0LWlkXSNbdmVyc2lvbi1leHByZXNzaW9uXSNbYWN0aW9uLXR5cGVdJnF1b3Q7IHBhdHRlcm4uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbmZpZy1mYWN0b3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGZhY3RvcnkgdGhhdCB3aWxsIGNvbnN0cnVjdCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHBhcmFtZXRlcml6aW5nIHRoZSBhY3Rpb24gZGVsZWdhdGUuIEEgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgbm90IG5lY2Vzc2FyeSBpZiB0aGUgZGVsZWdhdGUgZG9lcyBub3QgcmVxdWlyZSBwYXJhbWV0ZXJpemF0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY29uZmlnIGZhY3RvcnkgY2xhc3MgbmFtZS4gSGFzIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uQ29uZmlnRmFjdG9yeSBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uQ29uZmlnRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZWxlZ2F0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBkZWxlZ2F0ZSB0aGF0IHNob3VsZCBiZSBpbnZva2VkIHdoZW4gYW4gYWN0aW9uIG9yIGFuIGV2ZW50IGhhcHBlbnMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWxlZ2F0ZSBjbGFzcyBuYW1lLiBIYXMgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZSBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXZlbnQtaGFuZGxlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBkZXByZWNhdGVkPSJ0cnVlIi8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFkZHMgYW4gZXZlbnQgaGFuZGxlciBmb3Igb25lIG9mIHRoZSBldmVudHMgaW4gdGhlIGZhY2V0ZWQgcHJvamVjdCBsaWZlIGN5Y2xlLiBUaGUgZXZlbnQtaGFuZGxlciBlbGVtZW50IGNhbiBiZSB1c2VkIHN0YW5kYWxvbmUgb3IgZW1iZWRlZCBpbnNpZGUgdGhlIHByb2plY3QtZmFjZXQtdmVyc2lvbiBlbGVtZW50LiBJZiB1c2VkIGluc2lkZSB0aGUgcHJvamVjdC1mYWNldC12ZXJzaW9uIGVsZW1lbnQsIHRoZSBmYWNldCBhbmQgdmVyc2lvbiBhdHRyaWJ1dGVzIGFyZSBpbXBsaWVkIGFuZCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4mbHQ7YnIvJmd0OyZsdDtici8mZ3Q7Ci0KLSZsdDtiJmd0O0RlcHJlY2F0aW9uIE5vdGVzOiZsdDsvYiZndDsgVGhpcyBwYXJ0IG9mIHRoZSBmYWNldHMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQuIFRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnMgZXh0ZW5zaW9uIHBvaW50IHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlbGVnYXRlIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgZXZlbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQUkVfSU5TVEFMTCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQT1NUX0lOU1RBTEwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUFJFX1VOSU5TVEFMTCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQT1NUX1VOSU5TVEFMTCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQUkVfVkVSU0lPTl9DSEFOR0UiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVF9WRVJTSU9OX0NIQU5HRSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJSVU5USU1FX0NIQU5HRUQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjZXQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBldmVudCBoYW5kbGVyIGFwcGxpZXMgdG8uIFRoaXMgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGVtYmVkaW5nIHRoZSBldmVudC1oYW5kbGVyIGVsZW1lbnQgaW5zaWRlIHRoZSBwcm9qZWN0LWZhY2V0LXZlcnNpb24gZWxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBldmVudCBoYW5kbGVyIGFwcGxpZXMgdG8uIE11bHRpcGxlIHZlcnNpb25zIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdmVyc2lvbiBleHByZXNzaW9uIHN5bnRheC4gVGhlIHZlcnNpb24gZXhwcmVzc2lvbiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gJnF1b3Q7Mi4yLDIuNSxbMy4wLTUuM10sKDcuMyZxdW90Oywgd2hlcmUgdGhlIGNvbWFzIGZ1bmN0aW9uIGFzIGFuIE9SLiBCcmFja2V0cyBhbmQgcGFyZW50aGVzaXMgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcmFuZ2Ugbm90YXRpb24uIEEgYnJhY2tldCBtZWFucyBpbmNsdXNpdmUgd2hpbGUgYSBwYXJlbnRoZXNpcyBtZWFucyBleGNsdXNpdmUuIFRoaXMgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGVtYmVkaW5nIHRoZSBldmVudC1oYW5kbGVyIGVsZW1lbnQgaW5zaWRlIHRoZSBwcm9qZWN0LWZhY2V0LXZlcnNpb24gZWxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvcGVydHkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNldHMgYSBwcm9wZXJ0eSBvbiB0aGUgY29udGFpbmluZyBjb250ZXh0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZlcnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFVzZWQgdG8gcHJvdmlkZSB0aGUgZmFjZXQgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LiBJZiBhIGRlZmF1bHQgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbGF0ZXN0IHZlcnNpb24gd2lsbCBiZSB1c2VkLiBOb3RlIHRoYXQgaWYgYSBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGUgcnVudGltZSBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IHdpdGggYSB2ZXJzaW9uIGJlc3Qgc3VpdGVkIGZvciB0aGF0IHJ1bnRpbWUuIFRoZSBkZWZhdWx0IGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIHN0YXRpY2FsbHkgYnkgdXNpbmcgdGhlICZsdDtjb2RlJmd0O3ZlcnNpb24mbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBvciBkeW5hbWljYWxseSBieSBpbXBsZW1lbnRpbmcgdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyJmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UgYW5kIHVzaW5nIHRoZSAmbHQ7Y29kZSZndDtwcm92aWRlciZsdDsvY29kZSZndDsgYXR0cmlidXRlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0LiBUaGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGlmIHRoZSAmbHQ7Y29kZSZndDtwcm92aWRlciZsdDsvY29kZSZndDsgYXR0cmlidXRlIGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHZlcnNpb24gcHJvdmlkZXIgdGhhdCB3aWxsIGJlIGNvbnN1bHRlZCBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgdmVyc2lvbi4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCwgdGhlICZsdDtjb2RlJmd0O3ZlcnNpb24mbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWQgaWYgcHJlc2VudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imdyb3VwIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZXNjcmliZXMgYSBwcm9qZWN0IGZhY2V0IGdyb3VwLiBBIGdyb3VwIGlzIGEgbmFtZWQgY29sbGVjdGlvbiBvZiBwcm9qZWN0IGZhY2V0IHZlcnNpb25zLiBJdCBpcyB1c2VkIHByaW1hcmlseSBhcyBhIHBhcmFtZXRlciB0byB0aGUgJnF1b3Q7cmVxdWlyZXMmcXVvdDsgYW5kICZxdW90O2NvbmZsaWN0cyZxdW90OyBjb25zdHJhaW50cyBhbmQgYWxsb3dzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gd2hlcmUgYSBmYWNldCBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgYWxsIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cC4gQSBnaXZlbiBwcm9qZWN0IGZhY2V0IHZlcnNpb24gY2FuIGJlbG9uZyB0byBzZXZlcmFsIGdyb3Vwcy4gR3JvdXBzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB1c2VkIGluIHRoZSAmcXVvdDtncm91cC1tZW1iZXImcXVvdDsgZWxlbWVudCwgc28gYW4gZXhwbGljaXQgZ3JvdXAgZGVjbGFyYXRpb24gaXMgb3B0aW9uYWwuIEhvd2V2ZXIsIGl0IGRvZXMgYWxsb3cgYSBsYWJlbCBhbmQgYSBkZXNjcmlwdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdyb3VwLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsYWJlbCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEdyb3VwIGlkZW50aWZpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1lbWJlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWRkcyB0aGUgcHJvamVjdCBmYWNldCBhcyBhIG1lbWJlciBvZiBhIGNhdGVnb3J5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2F0ZWdvcnkgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7VGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIHRoZSB2YXJpb3VzIGZhY2lsaXRpZXMgZXhwb3NlZCBieSB0aGlzIGV4dGVuc2lvbiBwb2ludC4gVGhpcyBleGFtcGxlIGlzIHRha2VuIGZyb20gdGhlICZsdDtpJmd0O0J1aWxkaW5nIFByb2plY3QgRmFjZXRzJmx0Oy9pJmd0OyB0dXRvcmlhbC4mbHQ7L3AmZ3Q7Ci0KLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyZxdW90OyZndDsKLQotICAmbHQ7Y2F0ZWdvcnkgaWQ9JnF1b3Q7Zm9ybWdlbi5jYXRlZ29yeSZxdW90OyZndDsKLSAgICAmbHQ7bGFiZWwmZ3Q7Rm9ybUdlbiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0O0VuYWJsZXMgZ2VuZXJhdGlvbiBvZiBIVE1MIGZvcm1zIGJhc2VkIG9uIFhNTCBkZWZpbml0aW9uIGZpbGVzLiZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICZsdDsvY2F0ZWdvcnkmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQgaWQ9JnF1b3Q7Zm9ybWdlbi5jb3JlJnF1b3Q7Jmd0OwotICAgICZsdDtsYWJlbCZndDtGb3JtR2VuIENvcmUmbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAgICAgIEVuYWJsZXMgZ2VuZXJhdGlvbiBvZiBIVE1MIGZvcm1zIGJhc2VkIG9uIFhNTCBkZWZpbml0aW9uIGZpbGVzLgotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O2NhdGVnb3J5Jmd0O2Zvcm1nZW4uY2F0ZWdvcnkmbHQ7L2NhdGVnb3J5Jmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0mcXVvdDtmb3JtZ2VuLmNvcmUmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsmZ3Q7Ci0gICAgJmx0O2NvbnN0cmFpbnQmZ3Q7Ci0gICAgICAmbHQ7cmVxdWlyZXMgZmFjZXQ9JnF1b3Q7anN0LndlYiZxdW90OyB2ZXJzaW9uPSZxdW90OzIuMiwyLjMsMi40JnF1b3Q7LyZndDsKLSAgICAmbHQ7L2NvbnN0cmFpbnQmZ3Q7Ci0gICAgJmx0O2FjdGlvbiB0eXBlPSZxdW90O0lOU1RBTEwmcXVvdDsgaWQ9JnF1b3Q7Zm9ybWdlbi5jb3JlLmluc3RhbGwmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7Y29uZmlnLWZhY3RvcnkgY2xhc3M9JnF1b3Q7Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuQ29yZUZhY2V0SW5zdGFsbENvbmZpZyRGYWN0b3J5JnF1b3Q7LyZndDsKLSAgICAgICZsdDtkZWxlZ2F0ZSBjbGFzcz0mcXVvdDtjb20uZm9ybWdlbi5lY2xpcHNlLkZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsRGVsZWdhdGUmcXVvdDsvJmd0OwotICAgICZsdDsvYWN0aW9uJmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldCBpZD0mcXVvdDtmb3JtZ2VuLmV4dCZxdW90OyZndDsKLSAgICAmbHQ7bGFiZWwmZ3Q7Rm9ybUdlbiBFeHRlbnNpb25zJmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICBFbmFibGVzIGFkZGl0aW9uYWwgRm9ybUdlbiB3aWRnZXRzLgotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O2NhdGVnb3J5Jmd0O2Zvcm1nZW4uY2F0ZWdvcnkmbHQ7L2NhdGVnb3J5Jmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0mcXVvdDtmb3JtZ2VuLmV4dCZxdW90OyB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyZndDsKLSAgICAmbHQ7Y29uc3RyYWludCZndDsKLSAgICAgICZsdDtyZXF1aXJlcyBmYWNldD0mcXVvdDtmb3JtZ2VuLmNvcmUmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsvJmd0OwotICAgICZsdDsvY29uc3RyYWludCZndDsKLSAgICAmbHQ7YWN0aW9uIHR5cGU9JnF1b3Q7SU5TVEFMTCZxdW90OyZndDsKLSAgICAgICZsdDtkZWxlZ2F0ZSBjbGFzcz0mcXVvdDtjb20uZm9ybWdlbi5lY2xpcHNlLkZvcm1HZW5FeHRGYWNldEluc3RhbGxEZWxlZ2F0ZSZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9hY3Rpb24mZ3Q7Ci0gICZsdDsvcHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OwotCi0gICZsdDtwcmVzZXQgaWQ9JnF1b3Q7Zm9ybWdlbi5wcmVzZXQmcXVvdDsmZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0O0Zvcm1HZW4gV2ViIFByb2plY3QmbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDtDcmVhdGVzIGEgd2ViIHByb2plY3Qgd2l0aCBGb3JtR2VuIGZ1bmN0aW9uYWxpdHkuJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7anN0LmphdmEmcXVvdDsgdmVyc2lvbj0mcXVvdDs1LjAmcXVvdDsvJmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtqc3Qud2ViJnF1b3Q7IHZlcnNpb249JnF1b3Q7Mi4yJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7Zm9ybWdlbi5jb3JlJnF1b3Q7IHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7Zm9ybWdlbi5leHQmcXVvdDsgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsvJmd0OwotICAmbHQ7L3ByZXNldCZndDsKLSAgCi0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvbGlzdGVuZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvbGlzdGVuZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzg5Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL2xpc3RlbmVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIgaWQ9Imxpc3RlbmVycyIgbmFtZT0iRmFjZXRlZCBQcm9qZWN0IExpc3RlbmVycyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGZvciByZWdpc3RyYXRpb24gb2YgbGlzdGVuZXJzIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIHRoZSBtZXRhZGF0YSBvZiBmYWNldGVkIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIGV2ZW50IHR5cGVzIGFyZSBzdXBwb3J0ZWQ6IAotCi0mbHQ7cCZndDsKLSZsdDtjb2RlJmd0OwotUFJPSkVDVF9NT0RJRklFRCZsdDtici8mZ3Q7Ci1QUkVfSU5TVEFMTCZsdDtici8mZ3Q7Ci1QT1NUX0lOU1RBTEwmbHQ7YnIvJmd0OwotUFJFX1VOSU5TVEFMTCZsdDtici8mZ3Q7Ci1QT1NUX1VOSU5TVEFMTCZsdDtici8mZ3Q7Ci1QUkVfVkVSU0lPTl9DSEFOR0UmbHQ7YnIvJmd0OwotUE9TVF9WRVJTSU9OX0NIQU5HRSZsdDtici8mZ3Q7Ci1GSVhFRF9GQUNFVFNfQ0hBTkdFRCZsdDtici8mZ3Q7Ci1UQVJHRVRFRF9SVU5USU1FU19DSEFOR0VEJmx0O2JyLyZndDsKLVBSSU1BUllfUlVOVElNRV9DSEFOR0VECi0mbHQ7L2NvZGUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0KLSZsdDtwJmd0O1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUmbHQ7L2NvZGUmZ3Q7IGVudW0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCBlYWNoIGV2ZW50IHR5cGUuJmx0Oy9wJmd0OwotCi0mbHQ7cCZndDtJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZ2lzdGVyIGxpc3RlbmVycyBpbiBjb2RlIHVzaW5nIGVpdGhlciAmbHQ7Y29kZSZndDtGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lcigpJmx0Oy9jb2RlJmd0OyBvciAmbHQ7Y29kZSZndDtJRmFjZXRlZFByb2plY3QuYWRkTGlzdGVuZXIoKSZsdDsvY29kZSZndDsgbWV0aG9kcy4mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imxpc3RlbmVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imxpc3RlbmVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBSZWdpc3RlcnMgb25lIGxpc3RlbmVyLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbGlzdGVuZXIgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJldmVudFR5cGVzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnQgdHlwZXMgdGhhdCB0aGUgbGlzdGVuZXIgc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlzdGVuZXJzJnF1b3Q7Jmd0OwotICAmbHQ7IS0tIExpc3RlbiB0byBhbGwgZXZlbnRzLiAtLSZndDsKLSAgJmx0O2xpc3RlbmVyIGNsYXNzPSZxdW90O2NvbS5teWNvbXBhbnkubXlwcm9kdWN0Lk15TGlzdGVuZXIxJnF1b3Q7LyZndDsKLSAgJmx0OyEtLSBMaXN0ZW4gdG8gc3BlY2lmaWMgZXZlbnRzLiAtLSZndDsKLSAgJmx0O2xpc3RlbmVyIGNsYXNzPSZxdW90O2NvbS5teWNvbXBhbnkubXlwcm9kdWN0Lk15TGlzdGVuZXIyJnF1b3Q7IGV2ZW50VHlwZXM9JnF1b3Q7UFJPSkVDVF9NT0RJRklFRCZxdW90Oy8mZ3Q7Ci0gICZsdDtsaXN0ZW5lciBjbGFzcz0mcXVvdDtjb20ubXljb21wYW55Lm15cHJvZHVjdC5NeUxpc3RlbmVyMiZxdW90OyBldmVudFR5cGVzPSZxdW90O1BSRV9JTlNUQUxMLEZJWEVEX0ZBQ0VUU19DSEFOR0VEJnF1b3Q7LyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuJmx0O2JyLyZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9wcmVzZXRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NjaGVtYXMvcHJlc2V0cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM4Mzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9wcmVzZXRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIGlkPSJwcmVzZXRzIiBuYW1lPSJGYWNldGVkIFByb2plY3QgUHJlc2V0cyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBIHByZXNldCByZXByZXNlbnRzIGEgY29tbW9uIGNvbmZpZ3VyYXRpb24gb2YgZmFjZXRzIGFuZCB0aGVpciB2ZXJzaW9ucyB0aGF0IGdpdmUgYSB1c2VyIGEgc3RhcnRpbmcgcG9pbnQgd2hlbiBjb25maWd1cmluZyBhIHByb2plY3QuIFByZXNldHMgY2FuIGVpdGhlciBiZSBzdGF0aWMgb3IgZHluYW1pYy4gU3RhdGljIHByZXNldHMgYXJlIGZ1bGx5IHNwZWNpZmllZCBpbiB0aGlzIGV4dGVuc2lvbiBwb2ludC4gRHluYW1pYyBwcmVzZXRzIGFyZSBjcmVhdGVkIHVzaW5nIGFuIGV4dGVuZGVyLXN1cHBsaWVkIGZhY3RvcnkgdGhhdCBjYW4gdGFrZSBpbnRvIGFjY291bnQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByZXNldCB3aWxsIGJlIHVzZWQgaW4uIFN0YXRpYyBwcmVzZXRzIGNhbiBhbHNvIGV4dGVuZCBvdGhlciBwcmVzZXRzLgotCi0mbHQ7cCZndDtUbyBwcm9ncmFtbWF0aWNhbGx5IGRlZmluZSBhIHByZXNldCwgdXNlIHRoZSAmbHQ7Y29kZSZndDtQcm9qZWN0RmFjZXRzTWFuYWdlci5kZWZpbmVQcmVzZXQoKSZsdDsvY29kZSZndDsgbWV0aG9kcy4mbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXRpYy1wcmVzZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZHluYW1pYy1wcmVzZXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3RhdGljLXByZXNldCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBhIHN0YXRpYyBwcmVzZXQuIEEgc3RhdGljIHByZXNldCBpcyBmdWxseSBzcGVjaWZpZWQgaW4gdGhlIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGFiZWwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWNldCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHByZXNldCBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbmRzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcHJlc2V0IHRoYXQgdGhpcyBwcmVzZXQgaXMgZXh0ZW5kaW5nLiBJZiB0aGUgYmFzZSBwcmVzZXQgaW5jbHVkZXMgYSBmYWNldCB0aGF0JmFwb3M7cyBhbHNvIHNwZWNpZmllZCBieSB0aGlzIHByZXNldCAoZGVyaXZlZCksIHRoZSB2ZXJzaW9uIG9mIHRoZSBmYWNldCBzcGVjaWZpZWQgaW4gdGhlIGRlcml2ZWQgcHJlc2V0IHdpbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBsb2NhbGl6YWJsZSBuYW1lIHRoYXQgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaWQgd2lsbCBiZSB1c2VkIGZvciBhIGxhYmVsLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdGV4dC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZmFjZXQgdGhhdCBpcyBwYXJ0IG9mIHRoaXMgcHJlc2V0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHJvamVjdCBmYWNldCBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBmYWNldCB2ZXJzaW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkeW5hbWljLXByZXNldCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBhIGR5bmFtaWMgcHJlc2V0LiBBIGR5bmFtaWMgcHJlc2V0IHVzZXMgYSBmYWN0b3J5IHRvIHN5bnRoZXNpemUgdGhlIHByZXNldCBkZWZpbml0aW9uIG9uIHRoZSBmbHkgYmFzZWQgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgd2lsbCBiZSB1c2VkLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHJlc2V0IGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGZhY3RvcnkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBmYWN0b3J5IGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHMmcXVvdDsmZ3Q7Ci0KLSAgJmx0OyEtLSBEZWZpbmVzIGEgZHluYW1pYyBwcmVzZXQgd2hpY2ggd2lsbCBiZSBzeW50aGVzaXplZCBieSB0aGUgcHJvdmlkZWQgZmFjdG9yeS4gVGhpcyBwYXJ0aWN1bGFyIHByZXNldAotICAgICAgIGlzIGFjdHVhbGx5IHN1cHBsaWVkIGJ5IHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrLiBXaGF0IGl0IHJlc29sdmVzIHRvIGRlcGVuZHMgb24gdGhlIGNvbnRleHQuCi0gICAgICAgSWYgcHJvamVjdCBkb2VzIG5vdCB0YXJnZXQgYSBydW50aW1lLCBpdCB3aWxsIGNvbnRhaW4gb25seSB0aGUgZml4ZWQgZmFjZXRzIHdpdGggdGhlaXIgZGVmYXVsdAotICAgICAgIHZlcnNpb25zLiBJZiBwcm9qZWN0IHRhcmdldHMgb25lIG9yIG1vcmUgcnVudGltZSwgdGhpcyBwcmVzZXQgd2lsbCBjb250YWluIGZhY2V0cyB0aGF0IGFyZSBzcGVjaWZpZWQKLSAgICAgICB0byBiZSB0aGUgZGVmYXVsdCBmb3IgdGhlIHByaW1hcnkgcnVudGltZS4gLS0mZ3Q7Ci0gICAgICAgCi0gICZsdDtkeW5hbWljLXByZXNldCBpZD0mcXVvdDtkZWZhdWx0LmNvbmZpZ3VyYXRpb24mcXVvdDsmZ3Q7Ci0gICAgJmx0O2ZhY3RvcnkgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5JnF1b3Q7LyZndDsKLSAgJmx0Oy9keW5hbWljLXByZXNldCZndDsKLQotICAmbHQ7IS0tIENyZWF0ZXMgYSBwcmVzZXQgd2hpY2ggZXh0ZW5kcyB0aGUgJnF1b3Q7ZGVmYXVsdC5jb25maWd1cmF0aW9uJnF1b3Q7IHByZXNldCBhbmQgYWRkcyB0d28gZmFjZXRzLiAtLSZndDsgCi0gICAgICAgCi0gICZsdDtzdGF0aWMtcHJlc2V0IGlkPSZxdW90O215LmZhdm9yaXRlLnByZXNldCZxdW90OyBleHRlbmRzPSZxdW90O2RlZmF1bHQuY29uZmlndXJhdGlvbiZxdW90OyZndDsKLSAgICAmbHQ7bGFiZWwmZ3Q7TXkgRmF2b3JpdGUgQ29uZmlndXJhdGlvbiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0O0hlcmUgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIG15IGZhdm9yaXRlIGNvbmZpZ3VyYXRpb24uJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9JnF1b3Q7ZmFjZXRfYSZxdW90OyB2ZXJzaW9uPSZxdW90OzEuMiZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSZxdW90O2ZhY2V0X2ImcXVvdDsgdmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsvJmd0OwotICAmbHQ7L3N0YXRpYy1wcmVzZXQmZ3Q7Ci0gIAotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuJmx0O2JyLyZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9ydW50aW1lQnJpZGdlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL3J1bnRpbWVCcmlkZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTA0NDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL3J1bnRpbWVCcmlkZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBpZD0icnVudGltZUJyaWRnZXMiIG5hbWU9IlJ1bnRpbWUgQnJpZGdlcyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImJyaWRnZSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJicmlkZ2UiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIChubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUJyaWRnZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy9ydW50aW1lcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL3J1bnRpbWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzQ1ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL3J1bnRpbWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBpZD0icnVudGltZXMiIG5hbWU9IlJ1bnRpbWVzIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAobm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlKQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVudGltZS1jb21wb25lbnQtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3VwcG9ydGVkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZS1jb21wb25lbnQtdHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBhIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZlcnNpb24tY29tcGFyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCB0aGF0IHdpbGwgYmUgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBydW50aW1lIGNvbXBvbmVudCB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uLWNvbXBhcmF0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdmVyc2lvbiBjb21wYXJhdG9yLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3Igd2lsbCBiZSB1c2VkLiBUaGUgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaXMgY2FwYWJsZSBvZiBoYW5kaW5nIG51bWVyaWNhbCB2ZXJzaW9ucyB0aGF0IHVzZSBkZWNpbWFsIG5vdGF0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249ImphdmEudXRpbC5Db21wYXJhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgYSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgcnVudGltZSBjb21wb25lbnQgdHlwZSB0aGF0IHRoaXMgaXMgYSB2ZXJzaW9uIG9mLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZlcnNpb24gc3RyaW5nLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhZGFwdGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBSZWdpc3RlcnMgYW4gYWRhcHRlciB0byBiZSB1c2VkIHdpdGggc29tZSBzZXQgb2YgcnVudGltZSBjb21wb25lbnQgdHlwZXMgYW5kIHZlcnNpb25zLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lLWNvbXBvbmVudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InR5cGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lLWNvbXBvbmVudCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVXNlZCB0byByZWZlcmVuY2UgbXVsdGlwbGUgcnVudGltZSBjb21wb25lbnQgdHlwZXMgYW5kIHZlcnNpb25zLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgaWQuIElmIHRoaXMgYXR0cmlidXRlIGlzIHVzZWQsIHRoZSAmbHQ7Y29kZSZndDthbnkmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG1hdGNoIGV4cHJlc3Npb24gZm9yIHRoZSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uLiBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gJnF1b3Q7Mi4yLDIuNSxbMy4wLTUuM10sKDcuMyZxdW90Oywgd2hlcmUgdGhlIGNvbWFzIGZ1bmN0aW9uIGFzIGFuIE9SLiBCcmFja2V0cyBhbmQgcGFyZW50aGVzaXMgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcmFuZ2Ugbm90YXRpb24uIEEgYnJhY2tldCBtZWFucyBpbmNsdXNpdmUgd2hpbGUgYSBwYXJlbnRoZXNpcyBtZWFucyBleGNsdXNpdmUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW55IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbGwgcnVudGltZSBjb21wb25lbnQgdHlwZXMgYW5kIHZlcnNpb25zIHNob3VsZCBiZSBtYXRjaGVkLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyB1c2VkLCB0aGUgJmx0O2NvZGUmZ3Q7aWQmbHQ7L2NvZGUmZ3Q7IGFuZCAmbHQ7Y29kZSZndDt2ZXJzaW9uJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgdXNlZC4gTm90ZSB0aGF0IHRoaXMgYXR0cmlidXRlIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgJmx0O2NvZGUmZ3Q7cnVudGltZS1jb21wb25lbnQmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQgYXBwZWFycyBiZW5lYXRoIHRoZSAmbHQ7Y29kZSZndDtzdXBwb3J0ZWQmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgYWRhcHRlciBmYWN0b3J5LiBUaGUgZmFjdG9yeSBoYXMgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkgaW50ZXJmYWNlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0eXBlIHRoYXQgdGhpcyBhZGFwdGVyIHdpbGwgYmUgYWRhcHRpbmcgdG8uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBuYW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdXBwb3J0ZWQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZXNlIHByb2plY3QgZmFjZXRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlc2UgcnVudGltZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY2V0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWUtY29tcG9uZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFVzZWQgdG8gcmVmZXJlbmNlIG9uZSBvciBtb3JlIHZlcnNpb24gb2YgYSBwcm9qZWN0IGZhY2V0LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHByb2plY3QgZmFjZXQgaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG1hdGNoIGV4cHJlc3Npb24gZm9yIHRoZSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uLiBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gJnF1b3Q7Mi4yLDIuNSxbMy4wLTUuM10sKDcuMyZxdW90Oywgd2hlcmUgdGhlIGNvbWFzIGZ1bmN0aW9uIGFzIGFuIE9SLiBCcmFja2V0cyBhbmQgcGFyZW50aGVzaXMgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcmFuZ2Ugbm90YXRpb24uIEEgYnJhY2tldCBtZWFucyBpbmNsdXNpdmUgd2hpbGUgYSBwYXJlbnRoZXNpcyBtZWFucyBleGNsdXNpdmUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL3ZhbGlkYXRvcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc2NoZW1hcy92YWxpZGF0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDQ5Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zY2hlbWFzL3ZhbGlkYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIGlkPSJ2YWxpZGF0b3JzIiBuYW1lPSJGYWNldGVkIFByb2plY3QgVmFsaWRhdG9ycyBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVXNlZCBmb3IgZGVjbGFyaW5nIGZhY2V0ZWQgcHJvamVjdCB2YWxpZGF0b3JzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIChubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0b3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWNldCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVXNlZCB0byByZWZlcmVuY2Ugb25lIG9yIG1vcmUgdmVyc2lvbiBvZiBhIHByb2plY3QgZmFjZXQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcHJvamVjdCBmYWNldCBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbWF0Y2ggZXhwcmVzc2lvbiBmb3IgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHZlcnNpb24uIFRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBvZiB0aGUgZm9ybSAmcXVvdDsyLjIsMi41LFszLjAtNS4zXSwoNy4zJnF1b3Q7LCB3aGVyZSB0aGUgY29tYXMgZnVuY3Rpb24gYXMgYW4gT1IuIEJyYWNrZXRzIGFuZCBwYXJlbnRoZXNpcyBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSByYW5nZSBub3RhdGlvbi4gQSBicmFja2V0IG1lYW5zIGluY2x1c2l2ZSB3aGlsZSBhIHBhcmVudGhlc2lzIG1lYW5zIGV4Y2x1c2l2ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIGZhY2V0ZWQgcHJvamVjdCB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3IgY2FuIGJlIHJlc3RyaWN0ZWQgdG8gcHJvamVjdHMgY29udGFpbmluZyBzcGVjaWZpYyBmYWNldHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWNldCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWxpZGF0b3IgY2xhc3MgbmFtZS4gSGFzIHRvIGltcGxlbWVudCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RWYWxpZGF0b3IgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDtUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVjbGFyZXMgYSB2YWxpZGF0b3IgdGhhdCBhcHBsaWVzIHRvIHByb2plY3RzIHRoYXQgaGF2ZSBmYWNldDEgKHZlcnNpb24gMS4zIG9yIDIuNSkgYW5kIGZhY2V0MiAoYW55IHZlcnNpb24pIGluc3RhbGxlZC4mbHQ7L3AmZ3Q7Ci0KLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnZhbGlkYXRvcnMmcXVvdDsmZ3Q7Ci0gICZsdDt2YWxpZGF0b3IgY2xhc3M9JnF1b3Q7Y29tLm15Y29ycC5NeVZhbGlkYXRvcjEmcXVvdDsmZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSZxdW90O2ZhY2V0MSZxdW90OyB2ZXJzaW9uPSZxdW90OzEuMywyLjUmcXVvdDsvJmd0OwotICAgICZsdDtmYWNldCBpZD0mcXVvdDtmYWNldDImcXVvdDsvJmd0OwotICAmbHQ7L3ZhbGlkYXRvciZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0KLSZsdDtwJmd0O1RoZSBzZWNvbmQgZXhhbXBsZSBkZWNsYXJlcyBhIHZhbGlkYXRvciB0aGF0IGFwcGxpZXMgdG8gYWxsIGZhY2V0ZWQgcHJvamVjdHMuJmx0Oy9wJmd0OwotCi0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS52YWxpZGF0b3JzJnF1b3Q7Jmd0OwotICAmbHQ7dmFsaWRhdG9yIGNsYXNzPSZxdW90O2NvbS5teWNvcnAuTXlWYWxpZGF0b3IyJnF1b3Q7LyZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0FjdGlvbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvQWN0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjNlZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvQWN0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uQ29uZmlnCi17Ci0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZnBqd2M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqd2MgPSBmcGp3YzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZnY7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZnYgPSBmdjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9EZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmODUwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9EZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkRlZmF1bHRGYWNldHNFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIFByZXNldCBmYWN0b3J5IGZvciB0aGUgPGNvZGU+ZGVmYXVsdC5jb25maWd1cmF0aW9uPC9jb2RlPiBwcmVzZXQuIFRoZSBjb250ZW50cyBvZiB0aGlzIHByZXNldAotICogYXJlIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoKLSAqIAotICogPG9sPgotICogICA8bGk+SWYgYSBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHByZXNldCB3aWxsIGNvbnRhaW4gZGVmYXVsdCBmYWNldHMgYXMgc3BlY2lmaWVkIGJ5Ci0gKiAgICAge0BsaW5rIElSdW50aW1lI2dldERlZmF1bHRGYWNldHMoU2V0KX0uPC9saT4KLSAqICAgPGxpPklmIG5vIHJ1bnRpbWUgaXMgc2VsZWN0ZWQsIHRoaXMgcHJlc2V0IHdpbGwgY29udGFpbiBkZWZhdWx0IHZlcnNpb25zIGZvciBhbGwgb2YgdGhlIAotICogICAgIGZpeGVkIGZhY2V0cyBhcyBzcGVjaWZpZWQgYnkge0BsaW5rIElQcm9qZWN0RmFjZXQjZ2V0RGVmYXVsdFZlcnNpb24oKX0uCi0gKiA8L29sPgotICogCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5Ci0KLSAgICBpbXBsZW1lbnRzIElQcmVzZXRGYWN0b3J5Ci0gICAgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VUX0lEID0gImRlZmF1bHQuY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgUHJlc2V0RGVmaW5pdGlvbiBjcmVhdGVQcmVzZXQoIGZpbmFsIFN0cmluZyBwcmVzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiAKLSAgICAgICAgICAgID0gKElGYWNldGVkUHJvamVjdEJhc2UpIGNvbnRleHQuZ2V0KCBJRHluYW1pY1ByZXNldC5DT05URVhUX0tFWV9GQUNFVEVEX1BST0pFQ1QgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpOyAKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgICAgICAKLSAgICAgICAgaWYoIHJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5wcmVzZXRMYWJlbCwgcnVudGltZS5nZXRMb2NhbGl6ZWROYW1lKCkgKTsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5wcmVzZXREZXNjcmlwdGlvbiwgcnVudGltZS5nZXRMb2NhbGl6ZWROYW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gUmVzb3VyY2VzLnByZXNldExhYmVsTm9SdW50aW1lOwotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBSZXNvdXJjZXMucHJlc2V0RGVzY3JpcHRpb25Ob1J1bnRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyAKLSAgICAgICAgICAgID0gRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50LmdldERlZmF1bHRGYWNldHMoIGZwcm9qICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFByZXNldERlZmluaXRpb24oIGxhYmVsLCBkZXNjcmlwdGlvbiwgZmFjZXRzICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldExhYmVsOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXREZXNjcmlwdGlvbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlc2V0TGFiZWxOb1J1bnRpbWU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldERlc2NyaXB0aW9uTm9SdW50aW1lOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRGVmYXVsdENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9EZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkZWViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9EZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHJlc2V0TGFiZWwgPSBEZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIHswfQotcHJlc2V0RGVzY3JpcHRpb24gPSBBIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHdvcmtpbmcgd2l0aCB7MH0gcnVudGltZS4gQWRkaXRpb25hbCBmYWNldHMgY2FuIGxhdGVyIGJlIGluc3RhbGxlZCB0byBhZGQgbmV3IGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHByb2plY3QuCi1wcmVzZXRMYWJlbE5vUnVudGltZSA9IERlZmF1bHQgQ29uZmlndXJhdGlvbgotcHJlc2V0RGVzY3JpcHRpb25Ob1J1bnRpbWUgPSBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHByb3ZpZGVzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gQWRkaXRpb25hbCBmYWNldHMgY2FuIGxhdGVyIGJlIGluc3RhbGxlZCB0byBhZGQgbmV3IGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHByb2plY3QuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0RlZmF1bHRWZXJzaW9uQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWIxNjEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0RlZmF1bHRWZXJzaW9uQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgdmVyc2lvbiBjb21wYXJhdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gb25lIGlzIG5vdCBleHBsaWNpdGx5IAotICogc3BlY2lmaWVkLiBUaGUgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3IgY2FuIGhhbmRsZSB2ZXJzaW9uIHN0cmluZ3MgdXNpbmcgCi0gKiB0aGUgc3RhbmRhcmQgZGVjaW1hbCBub3RhdGlvbi4gSXQgY2FuIGFsc28gYmUgc3ViY2xhc3NlZCB0byBtb2RpZnkgdGhlIAotICogc2VwYXJhdG9ycyB0aGF0IGFyZSB1c2VkIG9yIHRvIHByb3ZpZGUgY3VzdG9tIHBhcnNpbmcgZm9yIGEgdmVyc2lvbiBzZWdtZW50LgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yCi0KLSAgICBpbXBsZW1lbnRzIENvbXBhcmF0b3I8U3RyaW5nPgotICAgIAotewotICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZSggZmluYWwgU3RyaW5nIG9iajEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb2JqMiApCi0gICAgCi0gICAgICAgIHRocm93cyBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQ29tcGFyYWJsZTxPYmplY3Q+W10gcGFyc2VkMSA9IHBhcnNlKCBvYmoxICk7Ci0gICAgICAgIGZpbmFsIENvbXBhcmFibGU8T2JqZWN0PltdIHBhcnNlZDIgPSBwYXJzZSggb2JqMiApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwYXJzZWQxLmxlbmd0aCAmJiBpIDwgcGFyc2VkMi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGludCByZXMgPSBwYXJzZWQxWyBpIF0uY29tcGFyZVRvKCBwYXJzZWQyWyBpIF0gKTsKLSAgICAgICAgICAgIGlmKCByZXMgIT0gMCApIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBwYXJzZWQxLmxlbmd0aCA+IHBhcnNlZDIubGVuZ3RoICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcGFyc2VkMS5sZW5ndGggPCBwYXJzZWQyLmxlbmd0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZQotICAgICAqIHVzZWQgd2hlbiBicmVha2luZyB0aGUgdmVyc2lvbiBzdHJpbmcgaW50byBzZWdtZW50cy4gVGhlIGRlZmF1bHQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zICIuIi4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlcnMKLSAgICAgKi8KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcGFyYXRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIuIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBzZWdtZW50IG9mIHRoZSB2ZXJzaW9uIHN0cmluZy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGFyc2VzCi0gICAgICogdGhlIGZpcnN0IHNlZ21lbnQgYXMgYW4gaW50ZWdlciAobGVhZGluZyB6ZXJvZXMgYXJlIGlnbm9yZWQpIGFuZCB0aGUKLSAgICAgKiByZXN0IG9mIHRoZSBzZWdtZW50cyBhcyBkZWNpbWFscyAobGVhZGluZyB6ZXJvZXMgYXJlIGtlcHQpLiBTdWJjbGFzc2VzIAotICAgICAqIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGN1c3RvbSBwYXJzaW5nIGZvciBhbnkgbnVtYmVyIG9mIAotICAgICAqIHNlZ21lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nCi0gICAgICogQHBhcmFtIHNlZ21lbnQgdGhlIHZlcnNpb24gc2VnbWVudAotICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhlIHNlZ21lbnQgaW4gdGhlIHZlcnNpb24gc3RyaW5nCi0gICAgICogQHJldHVybiB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWdtZW50IGFzIGEge0BsaW5rIENvbXBhcmFibGV9Ci0gICAgICogQHRocm93cyBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uIGlmIGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcKLSAgICAgKi8KLSAgICAKLSAgICBwcm90ZWN0ZWQgQ29tcGFyYWJsZTw/IGV4dGVuZHMgT2JqZWN0PiBwYXJzZSggZmluYWwgU3RyaW5nIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zaXRpb24gKQotICAgIAotICAgICAgICB0aHJvd3MgVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcG9zaXRpb24gPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKCBzZWdtZW50ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKCAiLiIgKyBzZWdtZW50ICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiggdGhpcywgdmVyc2lvbiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgdmVyc2lvbiBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZlciB0aGUgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHBhcnNlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyc2lvbgotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHJpdmF0ZSBDb21wYXJhYmxlPE9iamVjdD5bXSBwYXJzZSggZmluYWwgU3RyaW5nIHZlciApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gc2VnbWVudHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggU3RyaW5nVG9rZW5pemVyIHQgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCB2ZXIsIGdldFNlcGFyYXRvcnMoKSApOwotICAgICAgICAgICAgIHQuaGFzTW9yZVRva2VucygpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlZ21lbnRzLmFkZCggdC5uZXh0VG9rZW4oKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wYXJhYmxlW10gcGFyc2VkID0gbmV3IENvbXBhcmFibGVbIHNlZ21lbnRzLnNpemUoKSBdOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSBzZWdtZW50cy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXJzZWRbIGkgXSA9IHBhcnNlKCB2ZXIsIHNlZ21lbnRzLmdldCggaSApLCBpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYXJzZWQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmIyNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdEZyYW1ld29yawotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCAKLSAgICAgICAgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGlkIG9mIGEgYnVpbHQtaW4gcHJlc2V0IHRoYXQgcHJvdmlkZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBUaGUgY29udGVudHMgb2YgdGhpcyBwcmVzZXQKLSAgICAgKiBhcmUgY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgotICAgICAqIAotICAgICAqIDxvbD4KLSAgICAgKiAgIDxsaT5JZiBhIHJ1bnRpbWUgaXMgc2VsZWN0ZWQsIHRoaXMgcHJlc2V0IHdpbGwgY29udGFpbiBkZWZhdWx0IGZhY2V0cyBhcyBzcGVjaWZpZWQgYnkKLSAgICAgKiAgICAge0BsaW5rIElSdW50aW1lI2dldERlZmF1bHRGYWNldHMoU2V0KX0uPC9saT4KLSAgICAgKiAgIDxsaT5JZiBubyBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHByZXNldCB3aWxsIGNvbnRhaW4gZGVmYXVsdCB2ZXJzaW9ucyBmb3IgYWxsIG9mIHRoZSAKLSAgICAgKiAgICAgZml4ZWQgZmFjZXRzIGFzIHNwZWNpZmllZCBieSB7QGxpbmsgSVByb2plY3RGYWNldCNnZXREZWZhdWx0VmVyc2lvbigpfS4KLSAgICAgKiA8L29sPgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTkZJR1VSQVRJT05fUFJFU0VUX0lEIAotICAgICAgICA9ICJkZWZhdWx0LmNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsIGltcGwgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsoKSB7IH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGNyZWF0ZU5ld1Byb2plY3QoKQotICAgIHsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICByZXR1cm4gaW1wbC5jcmVhdGVOZXdQcm9qZWN0KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPkRldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgaXMgaW5zdGFsbGVkIGluIHRoZQotICAgICAqIHByb3ZpZGVkIHByb2plY3QuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIG5vdCAKLSAgICAgKiBhY2Nlc3NpYmxlLCB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZCBvciB0aGUgZmFjZXQgaWQgaXMgdW5yZWNvZ25pemVkLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBleHBsaWNpdGx5IGRlc2lnbmVkIHRvIGF2b2lkIGFjdGl2YXRpb24gb2YgdGhlIEZhY2V0ZWQKLSAgICAgKiBQcm9qZWN0IEZyYW1ld29yayBpZiB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZC4gRm9yIHRoZSBjb2RlIHRoYXQKLSAgICAgKiBvcGVyYXRlcyBpbiB0aGUgY29udGV4dCB3aGVyZSBpdCBjYW4gYmUgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgaGFzCi0gICAgICogc3RhcnRlZCBhbHJlYWR5LCBiZXR0ZXIgcGVyZm9ybWFuY2UgY2FuIGJlIGFjaGlldmVkIGJ5IHN0b3JpbmcgCi0gICAgICoge0BsaW5rIElQcm9qZWN0RmFjZXR9IGFuZCB7QGxpbmsgSVByb2plY3RGYWNldFZlcnNpb259IGluc3RhbmNlcyB1c2luZyB0aGUKLSAgICAgKiBzaW5nbGV0b24gcGF0dGVybiBhbmQgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIElGYWNldGVkUHJvamVjdCNoYXNQcm9qZWN0RmFjZXQoSVByb2plY3RGYWNldCl9IG9yCi0gICAgICoge0BsaW5rIElGYWNldGVkUHJvamVjdCNoYXNQcm9qZWN0RmFjZXQoSVByb2plY3RGYWNldFZlcnNpb24pfSBtZXRob2RzLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgCi0gICAgICoge0BsaW5rICNoYXNQcm9qZWN0RmFjZXQoSVByb2plY3QsU3RyaW5nLFN0cmluZyl9IHdpdGggPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiB2ZXJzaW9uIGV4cHJlc3Npb24gcGFyYW1ldGVyLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byBjaGVjayBmb3IgdGhlIGZhY2V0IHByZXNlbmNlCi0gICAgICogQHBhcmFtIGZpZCB0aGUgcHJvamVjdCBmYWNldCBpZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgcmVhZGluZyBmYWNldGVkIHByb2plY3QgbWV0YWRhdGEKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGhhc1Byb2plY3RGYWNldCggcHJvamVjdCwgZmlkLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIDxwPkRldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgaXMgaW5zdGFsbGVkIGluIHRoZQotICAgICAqIHByb3ZpZGVkIHByb2plY3QuIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIG5vdCAKLSAgICAgKiBhY2Nlc3NpYmxlLCB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZCBvciB0aGUgZmFjZXQgaWQgaXMgdW5yZWNvZ25pemVkLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBleHBsaWNpdGx5IGRlc2lnbmVkIHRvIGF2b2lkIGFjdGl2YXRpb24gb2YgdGhlIEZhY2V0ZWQKLSAgICAgKiBQcm9qZWN0IEZyYW1ld29yayBpZiB0aGUgcHJvamVjdCBpcyBub3QgZmFjZXRlZC4gRm9yIHRoZSBjb2RlIHRoYXQKLSAgICAgKiBvcGVyYXRlcyBpbiB0aGUgY29udGV4dCB3aGVyZSBpdCBjYW4gYmUgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgaGFzCi0gICAgICogc3RhcnRlZCBhbHJlYWR5LCBiZXR0ZXIgcGVyZm9ybWFuY2UgY2FuIGJlIGFjaGlldmVkIGJ5IHN0b3JpbmcgCi0gICAgICoge0BsaW5rIElQcm9qZWN0RmFjZXR9IGFuZCB7QGxpbmsgSVByb2plY3RGYWNldFZlcnNpb259IGluc3RhbmNlcyB1c2luZyB0aGUKLSAgICAgKiBzaW5nbGV0b24gcGF0dGVybiBhbmQgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIElGYWNldGVkUHJvamVjdCNoYXNQcm9qZWN0RmFjZXQoSVByb2plY3RGYWNldCl9IG9yCi0gICAgICoge0BsaW5rIElGYWNldGVkUHJvamVjdCNoYXNQcm9qZWN0RmFjZXQoSVByb2plY3RGYWNldFZlcnNpb24pfSBtZXRob2RzLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0byBjaGVjayBmb3IgdGhlIGZhY2V0IHByZXNlbmNlCi0gICAgICogQHBhcmFtIGZpZCB0aGUgcHJvamVjdCBmYWNldCBpZAotICAgICAqIEBwYXJhbSB2ZXhwciB0aGUgdmVyc2lvbiBtYXRjaCBleHByZXNzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgICAqICAgbWF0Y2ggYW55IHZlcnNpb24KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIHJlYWRpbmcgZmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhOwotICAgICAqICAgaWYgdGhlIHZlcnNpb24gZXhwcmVzc2lvbiBpcyBpbnZhbGlkCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZleHByICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJgotICAgICAgICAgICAgcHJvamVjdC5pc05hdHVyZUVuYWJsZWQoIEZhY2V0ZWRQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCApICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2plY3QgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZwcm9qICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGZpZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggZmlkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcHJvai5oYXNQcm9qZWN0RmFjZXQoIGYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gZnByb2ouZ2V0SW5zdGFsbGVkVmVyc2lvbiggZiApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZnYgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYuZ2V0VmVyc2lvbnMoIHZleHByICkuY29udGFpbnMoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VsZWN0ZWQgZXZlbnRzIGluIHRoZSBmYWNldGVkCi0gICAgICogcHJvamVjdCBsaWZlIGN5Y2xlIG9jY3VyLiBUaGUgbGlzdGVuZXIgd2lsbCBhcHBseSB0byBhbGwgZmFjZXRlZCBwcm9qZWN0cyB0aGF0IGV4aXN0IGluIHRoZQotICAgICAqIHdvcmtzcGFjZSBub3cgYW5kIGluIHRoZSBmdXR1cmUgKHVudGlsIHRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9yIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lcgotICAgICAqIEBwYXJhbSB0eXBlcyB0aGUgdHlwZXMgb2YgdGhlIGV2ZW50cyB0byBsaXN0ZW4gZm9yCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IHBhcmFtZXRlciBpcyA8Y29kZT5udWxsPC9jb2RlPiBvcgotICAgICAqICAgdGhlIDxjb2RlPnR5cGVzPC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkuCi0gICAgICogQHNlZSAjcmVtb3ZlTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIpCi0gICAgICogQHNlZSBJRmFjZXRlZFByb2plY3QjYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgSUZhY2V0ZWRQcm9qZWN0I3JlbW92ZUxpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyKQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgaW1wbC5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgaW1wbC5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lciB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rICNhZGRMaXN0ZW5lcihJRmFjZXRlZFByb2plY3RMaXN0ZW5lcixJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlW10pfSBtZXRob2QuIElmIHRoZQotICAgICAqIHNwZWNpZmllZCBsaXN0ZW5lciBpcyBub3QgcHJlc2VudCBpbiB0aGUgbGlzdGVuZXIgcmVnaXN0cnksIHRoaXMgY2FsbCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5saXN0ZW5lcjwvY29kZT4gcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHNlZSAjYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgSUZhY2V0ZWRQcm9qZWN0I2FkZExpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyLElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbXSkKLSAgICAgKiBAc2VlIElGYWNldGVkUHJvamVjdCNyZW1vdmVMaXN0ZW5lcihJRmFjZXRlZFByb2plY3RMaXN0ZW5lcikKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICAgICAgaW1wbC5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgIGltcGwucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemUoKQotICAgIHsKLSAgICAgICAgaWYoIGltcGwgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGltcGwgPSBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9GYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTE0NmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogRXhjZXB0aW9uIHRoYXQgY2FuIGJlIHRocm93biBpbiB2YXJpb3VzIHBsYWNlcyBpbiB0aGUgZnJhbWV3b3JrIGluc3RlYWQgb2YgYSBtb3JlIGdlbmVyaWMKLSAqIHtAbGluayBDb3JlRXhjZXB0aW9ufS4gCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbgotCi0gICAgZXh0ZW5kcyBDb3JlRXhjZXB0aW9uCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4cGVjdGVkOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmFjZXRlZCBwcm9qZWN0IGZyYW1ld29yayBleGNlcHRpb24gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWlsdXJlCi0gICAgICovCi0KLSAgICBwdWJsaWMgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFeGNlcHRpb24oIGZpbmFsIElTdGF0dXMgc3RhdHVzICkgCi0gICAgewotICAgICAgICBzdXBlciggc3RhdHVzICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmV4cGVjdGVkID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCBmcm9tIHRocm93ZXIncyBwZXJzcGVjdGl2ZS4gVGhpcyBjYW4gYmUgdXNlZAotICAgICAqIGFzIGEgc2lnbmFsIGJ5IGhhbmRsZXJzIHRvIGFsdGVyIHRoZSB3YXkgdGhlIGV4Y2VwdGlvbiBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZXhjZXB0aW9uIGlzIGV4cGVjdGVkIGZyb20gdGhyb3dlcidzIHBlcnNwZWN0aXZlCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeHBlY3RlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHBlY3RlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgZXhjZXB0aW9uIGlzIGV4cGVjdGVkIGZyb20gdGhyb3dlcidzIHBlcnNwZWN0aXZlLiBUaGlzIGNhbiBiZSB1c2VkCi0gICAgICogYXMgYSBzaWduYWwgYnkgaGFuZGxlcnMgdG8gYWx0ZXIgdGhlIHdheSB0aGUgZXhjZXB0aW9uIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgaWYgdGhlIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCBmcm9tIHRocm93ZXIncyBwZXJzcGVjdGl2ZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkKCBmaW5hbCBib29sZWFuIGV4cGVjdGVkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lBY3Rpb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lBY3Rpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkZjkyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQWN0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJQWN0aW9uQ29uZmlnCi17Ci0gICAgdm9pZCBzZXRWZXJzaW9uKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApOwotICAgIHZvaWQgc2V0UHJvamVjdE5hbWUoIFN0cmluZyBwam5hbWUgKTsKLSAgICBJU3RhdHVzIHZhbGlkYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQWN0aW9uQ29uZmlnRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUFjdGlvbkNvbmZpZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhMWNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQWN0aW9uQ29uZmlnRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBtZXRob2QgZm9yIGNyZWF0aW5nIAotICogYSBjb25maWcgb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwYXJhbWV0ZXJpemluZyB0aGUgZmFjZXQgYWN0aW9uCi0gKiBkZWxlZ2F0ZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJQWN0aW9uQ29uZmlnRmFjdG9yeQotewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmFjZXQgYWN0aW9uIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBUaGUgbmV3IGNvbmZpZ3VyYXRpb24KLSAgICAgKiBvYmplY3Qgc2hvdWxkIGlkZWFsbHkgYmUgcG9wdWxhdGVkIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGZhY2V0IGFjdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgY3JlYXRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0gICAgICovCi0gICAgCi0gICAgT2JqZWN0IGNyZWF0ZSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUFjdGlvbkRlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lBY3Rpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTdiOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUFjdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci0KLS8qKgotICogQW4gYWN0aW9uIGlzIGFuIG9wZXJhdGlvbiBvbiBhIHNpbmdsZSBmYWNldCB3aXRoaW4gYSBmYWNldGVkIHByb2plY3QgdG8KLSAqIGluc3RhbGwsIHVuaW5zdGFsbCwgb3IgY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIHRoZSBmYWNldC4gQW4gYWN0aW9uIGRlZmluaXRpb24KLSAqIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBmYWNldCBhdXRob3IgcmVnYXJkaW5nIHRoZQotICogaW1wbGVtZW50YXRpb24gb2YgYW4gYWN0aW9uLiBBIHNpbmdsZSBhY3Rpb24gZGVmaW5pdGlvbiBjYW4gYXBwbHkgdG8gbXVsdGlwbGUKLSAqIGZhY2V0IHZlcnNpb25zLiBGb3IgaW5zdGFuY2UsIHRoZSBmYWNldCBhdXRob3IgbWF5IGNob29zZSB0byBzdXBwbHkgb25lCi0gKiBhY3Rpb24gZGVmaW5pdGlvbiBmb3IgYWxsIHZlcnNpb25zIG9mIGhpcyBmYWNldC4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkRlZmluaXRpb24KLXsKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCdzIHVzZWQgdG8gY29uc3RyYWluIHRoZSBzdGFydGluZyB2ZXJzaW9uCi0gICAgICogb2YgdGhlIFZFUlNJT05fQ0hBTkdFIGFjdGlvbiBkZWZpbml0aW9uLgotICAgICAqLwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9GUk9NX1ZFUlNJT05TID0gImZyb20udmVyc2lvbnMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGFjdGlvbiBkZWZpbml0aW9uLiBJZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGEKLSAgICAgKiBkZWZhdWx0IGFjdGlvbiBpZCBpcyBnZW5lcmF0ZWQgdGhhdCB0YWtlcyB0aGUgZm9sbG93aW5nIGZvcm06Ci0gICAgICogW2ZhY2V0LWlkXSNbdmVyc2lvbi1leHByZXNzaW9uXSNbYWN0aW9uLXR5cGVdKCNbcHJvcC5uYW1lXT1bcHJvcC52YWx1ZV0pKi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgYWN0aW9uIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBhY3Rpb24gZGVmaW5pdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IHRoaXMgYWN0aW9uIGRlZmluaXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoCi0gICAgICovCi0gICAgCi0gICAgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gdGhhdCBjb250cm9scyB3aGljaCBmYWNldCB2ZXJzaW9ucyB0aGlzCi0gICAgICogYWN0aW9uIGRlZmluaXRpb24gYXBwbGllcyB0by4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gdGhhdCBjb250cm9scyB3aGljaCBmYWNldCB2ZXJzaW9ucyB0aGlzCi0gICAgICogICBhY3Rpb24gZGVmaW5pdGlvbiBhcHBsaWVzIHRvCi0gICAgICovCi0gICAgCi0gICAgSVZlcnNpb25FeHByIGdldFZlcnNpb25FeHByKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIHR5cGUsIHN1Y2ggYXMgPGNvZGU+SU5TVEFMTDwvY29kZT4sIDxjb2RlPlVOSU5TVEFMTDwvY29kZT4sCi0gICAgICogb3IgPGNvZGU+VkVSU0lPTl9DSEFOR0U8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiB0eXBlCi0gICAgICovCi0gICAgCi0gICAgQWN0aW9uLlR5cGUgZ2V0QWN0aW9uVHlwZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgdGhhdCBmdXJ0aGVyIHNwZWNpZnkgYWN0aW9uIGJlaGF2aW9yIGFuZCAKLSAgICAgKiBhcHBsaWNhYmlsaXR5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBhY3Rpb24gZGVmaW5pdGlvbgotICAgICAqLwotICAgIAotICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgZ2V0UHJvcGVydHkoIFN0cmluZyBuYW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjb25maWcgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlcml6aW5nIHRoZQotICAgICAqIGV4ZWN1dGlvbiBvZiB0aGlzIGFjdGlvbi4gSWYgdGhpcyBhY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEKLSAgICAgKiBjb25maWcgb2JqZWN0IGZhY3RvcnksIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBjb25maWcgb2JqZWN0Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCB3aGlsZSBpbnN0YW50aWF0aW5nIHRoZSBjb25maWcgb2JqZWN0Ci0gICAgICogICBmYWN0b3J5IG9yIGNyZWF0aW5nIHRoZSBjb25maWcgb2JqZWN0Ci0gICAgICovCi0KLSAgICBPYmplY3QgY3JlYXRlQ29uZmlnT2JqZWN0KCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBjb25maWcgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlcml6aW5nIHRoZQotICAgICAqIGV4ZWN1dGlvbiBvZiB0aGlzIGFjdGlvbi4gSWYgdGhpcyBhY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEKLSAgICAgKiBjb25maWcgb2JqZWN0IGZhY3RvcnksIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmdiB0aGUgYWN0dWFsIGZhY2V0IHZlcnNpb24gdGhhdCB0aGlzIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSB1c2VkCi0gICAgICogICB3aXRoOyBzaG91bGQgYmUgb25lIG9mIHRoZSB2ZXJzaW9ucyBtYXRjaGVkIGJ5IHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24KLSAgICAgKiAgIHNwZWNpZmllZCBmb3IgdGhpcyBhY3Rpb24gZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBwam5hbWUgdGhlIHByb2plY3QgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIG5ldyBjb25maWcgb2JqZWN0Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCB3aGlsZSBpbnN0YW50aWF0aW5nIHRoZSBjb25maWcgb2JqZWN0Ci0gICAgICogICBmYWN0b3J5IG9yIGNyZWF0aW5nIHRoZSBjb25maWcgb2JqZWN0Ci0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgY3JlYXRlQ29uZmlnT2JqZWN0KCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGpuYW1lICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNhdGVnb3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzZmNjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLS8qKgotICogTW9kZWxzIGEgZ3JvdXBpbmcgb2YgcHJvamVjdCBmYWNldHMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgc2VsZWN0ZWQgYW5kIAotICogZGVzZWxlY3RlZCBhcyBhIHNldC4gVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IAotICogY2xpZW50cy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJQ2F0ZWdvcnkKLQotICAgIGV4dGVuZHMgSUFkYXB0YWJsZQotICAgIAotewotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIFN0cmluZyBnZXRQbHVnaW5JZCgpOwotICAgIFN0cmluZyBnZXRMYWJlbCgpOwotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgZmFjZXRzIHRoYXQgY29tcG9zZSB0aGlzIGNhdGVnb3J5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciBwcm9qZWN0IGZhY2V0cwotICAgICAqLwotICAgIAotICAgIFNldDxJUHJvamVjdEZhY2V0PiBnZXRQcm9qZWN0RmFjZXRzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5ZWVjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotCi0vKioKLSAqIE1vZGVscyBhIHNpbmdsZSBjb25zdHJhaW50IGluIHRoZSBjb25zdHJhaW50IGV4cHJlc3Npb24uIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb25zdHJhaW50IAotewotICAgIC8qKgotICAgICAqIFRoZSBlbnVtZXJhdGlvbiBvZiBvcGVyYXRvciB0eXBlcy4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZyxUeXBlPiBpdGVtcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxUeXBlPigpOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQU5EID0gbmV3IFR5cGUoICJhbmQiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIE9SID0gbmV3IFR5cGUoICJvciIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgUkVRVUlSRVMgPSBuZXcgVHlwZSggInJlcXVpcmVzIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBDT05GTElDVFMgPSBuZXcgVHlwZSggImNvbmZsaWN0cyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgVHlwZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgaXRlbXMucHV0KCBuYW1lLCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSB2YWx1ZU9mKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVtcy5nZXQoIG5hbWUudG9Mb3dlckNhc2UoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcGVyYXRvciB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb3BlcmF0b3IgdHlwZQotICAgICAqLwotICAgIAotICAgIFR5cGUgZ2V0VHlwZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb3BlcmFuZHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBvcGVyYW5kcwotICAgICAqLwotICAgIAotICAgIExpc3Q8T2JqZWN0PiBnZXRPcGVyYW5kcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9wZXJhbmQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHBvc2l0aW9uIG9mIHRoZSBvcGVyYW5kIGluIHRoZSBsaXN0IG9mIG9wZXJhbmRzCi0gICAgICogQHJldHVybiB0aGUgb3BlcmFuZAotICAgICAqLwotICAgIAotICAgIE9iamVjdCBnZXRPcGVyYW5kKCBpbnQgaW5kZXggKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhpcyBjb25zdHJhaW50IGFnYWluc3QgdGhlIGdpdmVuIHNldCBvZiBwcm9qZWN0IGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXRzIGEgc2V0IG9mIHByb2plY3QgZmFjZXRzCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBvZiB7QGxpbmsgSVN0YXR1cyNPS30gaWYgdGhlCi0gICAgICogICBjb25zdHJhaW50IHdhcyBzYXRpc2ZpZWQgb3Igb3RoZXJ3aXNlIGEge0BsaW5rIE11bHRpU3RhdHVzfSBjb21wb3NlZCBvZgotICAgICAqICAgaW5kaXZpZHVhbCBzdGF0dXMgb2JqZWN0cyBmb3IgZWFjaCBvZiB0aGUgcHJvYmxlbXMKLSAgICAgKi8KLSAgICAKLSAgICBJU3RhdHVzIGNoZWNrKCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhpcyBjb25zdHJhaW50IGFnYWluc3QgdGhlIGdpdmVuIHNldCBvZiBwcm9qZWN0IGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXRzIGEgc2V0IG9mIHByb2plY3QgZmFjZXRzCi0gICAgICogQHBhcmFtIHZhbGlkYXRlU29mdERlcGVuZGVuY2llcyBpZiA8Y29kZT50cnVlPC9jb2RlPiBzb2Z0IGRlcGVuZGVuY2llcwotICAgICAqICAgd2lsbCBiZSB0cmVhdGVkIGFzIHJlcXVpcmVkCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBvZiB7QGxpbmsgSVN0YXR1cyNPS30gaWYgdGhlCi0gICAgICogICBjb25zdHJhaW50IHdhcyBzYXRpc2ZpZWQgb3Igb3RoZXJ3aXNlIGEge0BsaW5rIE11bHRpU3RhdHVzfSBjb21wb3NlZCBvZgotICAgICAqICAgaW5kaXZpZHVhbCBzdGF0dXMgb2JqZWN0cyBmb3IgZWFjaCBvZiB0aGUgcHJvYmxlbXMKLSAgICAgKi8KLQotICAgIElTdGF0dXMgY2hlY2soIENvbGxlY3Rpb248SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cywKLSAgICAgICAgICAgICAgICAgICBib29sZWFuIHZhbGlkYXRlU29mdERlcGVuZGVuY2llcyApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lEZWZhdWx0VmVyc2lvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTg5MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGZhY2V0IHZlcnNpb24gdGhhdAotICogaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC4gSWYgYSB2ZXJzaW9uIHByb3ZpZGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXRlc3QKLSAqIHZlcnNpb24gd2lsbCBiZSB1c2VkLiBOb3RlIHRoYXQgaWYgYSBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGUgcnVudGltZSBjYW4gCi0gKiBvdmVycmlkZSB0aGlzIGRlZmF1bHQgd2l0aCBhIHZlcnNpb24gYmVzdCBzdWl0ZWQgZm9yIHRoYXQgcnVudGltZS4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYWNldCB2ZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmFjZXQgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0Ci0gICAgICovCi0gICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdFZlcnNpb24oKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwNTg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBwcm92aWRlIGxvZ2ljIGFzc29jaWF0ZWQgd2l0aAotICogYSBwYXJ0aWN1bGFyIGV2ZW50IGluIHByb2plY3QgZmFjZXQncyBsaWZlIGN5Y2xlLCBzdWNoIGFzIGluc3RhbGwgb3IgCi0gKiB1bmluc3RhbGwuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURlbGVnYXRlIAotewotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgdGhhdCdzIGNhbGxlZCB0byBleGVjdXRlIHRoZSBkZWxlZ2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgd29ya3NwYWNlIHByb2plY3QKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHRoaXMgZGVsZWdhdGUgaXMgaGFuZGxpbmc7IHRoaXMKLSAgICAgKiAgIGlzIHVzZWZ1bCB3aGVuIHNoYXJpbmcgdGhlIGRlbGVnYXRlIGFtb25nIHNldmVyYWwgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLSAgICAgKiAgIHByb2plY3QgZmFjZXQgb3IgZXZlbiBkaWZmZXJlbnQgcHJvamVjdCBmYWNldHMKLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZGVmYXVsdHMKLSAgICAgKiAgIHNob3VsZCBiZSB1c2VkCi0gICAgICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGRlbGVnYXRlIGZhaWxzIGZvciBhbnkgcmVhc29uCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBleGVjdXRlKCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRHluYW1pY1ByZXNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUR5bmFtaWNQcmVzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYTI4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRHluYW1pY1ByZXNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIEEgZHluYW1pYyBwcmVzZXQgaXMgdHlwZSBvZiBwcmVzZXQgdGhhdCBuZWVkcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuIFRoZSByZXNvbHZlCi0gKiBvcGVyYXRpb24gcmVsaWVzIHRoZSB7QGxpbmsgSVByZXNldEZhY3Rvcnl9IHNwZWNpZmllZCB3aGVuIHRoZSBkeW5hbWljIHByZXNldCBpcyByZWdpc3RlcmVkIHZpYQotICogdGhlIDxjb2RlPnByZXNldHM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBhbmQgY2FuIHRha2UgaW50byBhY2NvdW50IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSAKLSAqIHByZXNldCB3aWxsIGJlIHVzZWQuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElEeW5hbWljUHJlc2V0Ci0KLSAgICBleHRlbmRzIElQcmVzZXQKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBUaGUga2V5IG9mIHRoZSBjb250ZXh0IG1hcCBlbnRyeSB3aG9zZSB2YWx1ZSBpcyBhbiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0QmFzZX0gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfS0VZX0ZBQ0VURURfUFJPSkVDVCA9ICJDT05URVhUX0tFWV9GQUNFVEVEX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGtleSBvZiB0aGUgY29udGV4dCBtYXAgZW50cnkgd2hvc2UgdmFsdWUgaXMgYSBzZXQgb2Yge0BsaW5rIElQcm9qZWN0RmFjZXR9IG9iamVjdHMKLSAgICAgKiByZXByZXNlbnRpbmcgdGhlIGZpeGVkIGZhY2V0cy4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfS0VZX0ZJWEVEX0ZBQ0VUUyA9ICJDT05URVhUX0tFWV9GSVhFRF9GQUNFVFMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGtleSBvZiB0aGUgY29udGV4dCBtYXAgZW50cnkgd2hvc2UgdmFsdWUgaXMgdGhlIHByaW1hcnkgcnVudGltZSAoe0BsaW5rIElSdW50aW1lfSkgb3IKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBydW50aW1lIGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAqLwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9LRVlfUFJJTUFSWV9SVU5USU1FID0gIkNPTlRFWFRfS0VZX1BSSU1BUllfUlVOVElNRSI7ICAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgdGhlIGR5bmFtaWMgcHJlc2V0IHVzaW5nIHRoZSBwcm92aWRlZCBjb250ZXh0IGluZm9ybWF0aW9uLiBJZiB0aGlzIHByZXNldCBpcyBub3QKLSAgICAgKiBhcHBsaWNhYmxlIHRvIHRoZSBwcm92aWRlZCBjb250ZXh0LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgY29udGV4dCB0aGF0IHRoaXMgcHJlc2V0IHdpbGwgYmUgdXNlZCBpbgotICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIHByZXNldCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgCi0gICAgSVByZXNldCByZXNvbHZlKCBNYXA8U3RyaW5nLE9iamVjdD4gY29udGV4dCApOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUZhY2V0ZWRQcm9qZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhOGNlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIG1hbmlwdWxhdGluZyB0aGUgc2V0IG9mIGZhY2V0cyBpbnN0YWxsZWQgb24gYQotICogcHJvamVjdC4gVXNlIHtAbGluayBQcm9qZWN0RmFjZXRzTWFuYWdlciNjcmVhdGUoSVByb2plY3QpfSB0byBnZXQgYW4gaW5zdGFuY2UgCi0gKiBvZiB0aGlzIGludGVyZmFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3QgCi0KLSAgICBleHRlbmRzIElGYWNldGVkUHJvamVjdEJhc2UKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIGEgc2luZ2xlIGFjdGlvbiBzdWNoIGFzIGluc3RhbGxpbmcgb3IgdW5pbnN0YWxsaW5nIGEgcHJvamVjdAotICAgICAqIGZhY2V0LgotICAgICAqLwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBBY3Rpb24KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYWN0aW9uIHR5cGUgZW51bWVyYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsVHlwZT4gaXRlbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsVHlwZT4oKTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBJTlNUQUxMID0gbmV3IFR5cGUoICJJTlNUQUxMIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgVU5JTlNUQUxMID0gbmV3IFR5cGUoICJVTklOU1RBTEwiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBWRVJTSU9OX0NIQU5HRSA9IG5ldyBUeXBlKCAiVkVSU0lPTl9DSEFOR0UiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RhdGljCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaXRlbXMucHV0KCAiaW5zdGFsbCIsIElOU1RBTEwgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGl0ZW1zLnB1dCggInVuaW5zdGFsbCIsIFVOSU5TVEFMTCApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaXRlbXMucHV0KCAidmVyc2lvbi1jaGFuZ2UiLCBWRVJTSU9OX0NIQU5HRSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByaXZhdGUgVHlwZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgaXRlbXMucHV0KCBuYW1lLCB0aGlzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSB2YWx1ZU9mKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmdldCggbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2OwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBjb25maWc7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdHlwZSBhY3Rpb24gdHlwZQotICAgICAgICAgKiBAcGFyYW0gZnYgdGhlIHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24KLSAgICAgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljIEFjdGlvbiggZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0eXBlID09IG51bGwgfHwgZnYgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5mdiA9IGZ2OwotICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gdHlwZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgYWN0aW9uIHR5cGUKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBwcm9qZWN0IGZhY2V0IHZlcnNpb24gdGhhdCB0aGlzIAotICAgICAgICAgKiBhY3Rpb24gd2lsbCBiZSBtYW5pcHVsYXRpbmcuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIHRoYXQgdGhpcyBhY3Rpb24gCi0gICAgICAgICAqICAgd2lsbCBiZSBtYW5pcHVsYXRpbmcKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZ2OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWN0aW9uLCBpZiBhbnkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpb24sIG9yCi0gICAgICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldENvbmZpZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKCBmaW5hbCBPYmplY3Qgb2JqICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgKCBvYmogaW5zdGFuY2VvZiBBY3Rpb24gKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBvYmo7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSBhY3Rpb24udHlwZSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdi5lcXVhbHMoIGFjdGlvbi5mdiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5oYXNoQ29kZSgpIF4gdGhpcy5mdi5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnVmLmFwcGVuZCggdGhpcy50eXBlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICdbJyApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5mdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAnICcgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMuZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAnXScgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldEluc3RhbGxlZFZlcnNpb24oIElQcm9qZWN0RmFjZXQgZiApOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPkluc3RhbGxzIGEgcHJvamVjdCBmYWNldCBvbiB0aGlzIHByb2plY3QuIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICogY2FsbGluZyB0aGUge0BsaW5rICNtb2RpZnkoU2V0LCBJUHJvZ3Jlc3NNb25pdG9yKX0gbWV0aG9kIHdpdGggYSBzaW5nbGUgCi0gICAgICogaW5zdGFsbCBhY3Rpb24uPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnYgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSAKLSAgICAgKiAgIGluc3RhbGxlZAotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIHJlcG9ydGluZyBhbmQgCi0gICAgICogICBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGluc3RhbGwKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGluc3RhbGxQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+VW5pbnN0YWxscyBhIHByb2plY3QgZmFjZXQgZnJvbSB0aGlzIHByb2plY3QuIFRoaXMgbWV0aG9kIGlzIAotICAgICAqIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUge0BsaW5rICNtb2RpZnkoU2V0LCBJUHJvZ3Jlc3NNb25pdG9yKX0gbWV0aG9kIAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5pbnN0YWxsIGFjdGlvbi48L3A+Ci0gICAgICogCi0gICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkIGFzIGl0IGlzIGxvbmctCi0gICAgICogcnVubmluZyBhbmQgbWF5IHRyaWdnZXIgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cy4gQWx0aG91Z2ggdGhpcyBmcmFtZXdvcmsKLSAgICAgKiBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlIGFuZCB0aGUKLSAgICAgKiByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBmdiB0aGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIHRoYXQgc2hvdWxkIGJlIAotICAgICAqICAgdW5pbnN0YWxsZWQKLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgbnVsbCBpZiBwcm9ncmVzcyByZXBvcnRpbmcgYW5kIAotICAgICAqICAgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nIGR1cmluZyB1bmluc3RhbGwKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIHVuaW5zdGFsbFByb2plY3RGYWNldCggSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPk1vZGlmaWVzIHRoZSBzZXQgb2YgcHJvamVjdCBmYWNldHMgaW5zdGFsbGVkIG9uIHRoaXMgcHJvamVjdCBieSAKLSAgICAgKiBwZXJmb3JtaW5nIGEgc2VyaWVzIG9mIGFjdGlvbnMgc3VjaCBhcyBpbnN0YWxsIGFuZCB1bmluc3RhbGwuPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgc2V0IG9mIGFjdGlvbnMgdG8gYXBwbHkgdG8gdGhlIHByb2plY3QKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgcmVwb3J0aW5nIGFuZCAKLSAgICAgKiAgIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZyB3aGlsZSBhcHBseWluZyBhY3Rpb25zCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBtb2RpZnkoIFNldDxBY3Rpb24+IGFjdGlvbnMsCi0gICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNldCBvZiBmaXhlZCBwcm9qZWN0IGZhY2V0cyBmb3IgdGhpcyBwcm9qZWN0LiBGaXhlZCBmYWNldHMgCi0gICAgICogY2Fubm90IGJlIHVuaW5zdGFsbGVkLCBidXQgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGNhbiBiZSBjaGFuZ2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNldHMgdGhlIHNldCBvZiBwcm9qZWN0IGZhY2V0cyB0byBtYXJrIGFzIGZpeGVkCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCB3aGlsZSB1cGRhdGluZyB0aGUgc2V0IG9mIGZpeGVkIHByb2plY3QKLSAgICAgKiAgIGZhY2V0cwotICAgICAqLwotCi0gICAgdm9pZCBzZXRGaXhlZFByb2plY3RGYWNldHMoIFNldDxJUHJvamVjdEZhY2V0PiBmYWNldHMgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0VGFyZ2V0UnVudGltZXMoKSBhbmQgZ2V0UHJpbWFyeVJ1bnRpbWUoKSBpbnN0ZWFkCi0gICAgICovCi0gICAgCi0gICAgSVJ1bnRpbWUgZ2V0UnVudGltZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwgaWYgcHJvZ3Jlc3MgcmVwb3J0aW5nIGFuZCAKLSAgICAgKiAgIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0VGFyZ2V0UnVudGltZXMoKSBhbmQgc2V0UHJpbWFyeVJ1bnRpbWUoKSBpbnN0ZWFkCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBzZXRSdW50aW1lKCBJUnVudGltZSBydW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+U2V0cyB0aGUgcnVudGltZXMgdGhhdCB0aGlzIHByb2plY3Qgd2lsbCB0YXJnZXQuIFdoZW4gYSBwcm9qZWN0IAotICAgICAqIHRhcmdldHMgYSBydW50aW1lLCB0aGUgc2V0IG9mIGZhY2V0cyB0aGF0IGNhbiBiZSBpbnN0YWxsZWQgaXMgbGltaXRlZCB0byAKLSAgICAgKiB0aG9zZSBzdXBwb3J0ZWQgYnkgdGhhdCBydW50aW1lLiBXaGVuIGEgcHJvamVjdCB0YXJnZXRzIG11bHRpcGxlIAotICAgICAqIHJ1bnRpbWVzLCB0aGUgc2V0IG9mIGFwcGxpY2FibGUgZmFjZXRzIGlzIGxpbWl0ZWQgdG8gdGhvc2Ugc3VwcG9ydGVkIGJ5IAotICAgICAqIGFsbCB0YXJnZXRlZCBydW50aW1lcy48cD4KLSAgICAgKiAKLSAgICAgKiA8cD5JZiB0aGUgZXhpc3RpbmcgcHJpbWFyeSBydW50aW1lIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGlzIG5vdCBwYXJ0IG9mIAotICAgICAqIHRoZSBuZXcgc2V0IG9mIHRhcmdldGVkIHJ1bnRpbWVzLCB0aGUgcHJpbWFyeSBydW50aW1lIHdpbGwgYmUgcmVzZXQgdG8gCi0gICAgICogb25lIHBpY2tlZCBhdCByYW5kb20gZnJvbSB0aGUgbmV3IHNldC4gSWYgdGhlIG5ldyBzZXQgaXMgZW1wdHksIHRoZSAKLSAgICAgKiBwcmltYXJ5IHJ1bnRpbWUgd2lsbCBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uPC9wPgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCBhcyBpdCBpcyBsb25nLQotICAgICAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMuIEFsdGhvdWdoIHRoaXMgZnJhbWV3b3JrCi0gICAgICogaXMgc2FmZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgb3RoZXIgYnVuZGxlcyBhcmUgVUktc2FmZSBhbmQgdGhlCi0gICAgICogcmlzayBvZiBVSSBkZWFkbG9jayBpcyBoaWdoLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVudGltZXMgdGhlIG5ldyBzZXQgb2YgcnVudGltZXMgdG8gdGFyZ2V0Ci0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotICAgICAqICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIHByb2plY3QgY29udGFpbnMgb25lIG9yIG1vcmUgZmFjZXRzIHRoYXQKLSAgICAgKiAgIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBvZiB0aGUgbmV3IHJ1bnRpbWVzOyBpZiBmYWlsZWQgZm9yIGFueSBvdGhlciAKLSAgICAgKiAgIHJlYXNvbgotICAgICAqLwotICAgIAotICAgIHZvaWQgc2V0VGFyZ2V0ZWRSdW50aW1lcyggU2V0PElSdW50aW1lPiBydW50aW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPkFkZHMgYSBuZXcgcnVudGltZSB0byB0aGUgc2V0IG9mIHJ1bnRpbWVzIHRhcmdldGVkIGJ5IHRoaXMgcHJvamVjdC4KLSAgICAgKiBJZiB0aGUgc2V0IG9mIHRhcmdldGVkIHJ1bnRpbWVzIGhhcyBiZWVuIGVtcHR5IHByaW9yIHRvIHRoaXMgY2FsbCwgdGhpcwotICAgICAqIHJ1bnRpbWUgd2lsbCBiZWNvbWUgdGhlIHByaW1hcnkgcnVudGltZTwvcD4KLSAgICAgKiAgCi0gICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkIGFzIGl0IGlzIGxvbmctCi0gICAgICogcnVubmluZyBhbmQgbWF5IHRyaWdnZXIgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cy4gQWx0aG91Z2ggdGhpcyBmcmFtZXdvcmsKLSAgICAgKiBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlIGFuZCB0aGUKLSAgICAgKiByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotICAgICAqICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIHByb2plY3QgY29udGFpbnMgb25lIG9yIG1vcmUgZmFjZXRzIHRoYXQKLSAgICAgKiAgIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcnVudGltZTsgaWYgZmFpbGVkIGZvciBhbnkgb3RoZXIgcmVhc29uCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBhZGRUYXJnZXRlZFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPlJlbW92ZXMgYSBydW50aW1lIGZyb20gdGhlIHNldCBvZiBydW50aW1lcyB0YXJnZXRlZCBieSB0aGlzIHByb2plY3QuCi0gICAgICogSWYgdGhpcyBydW50aW1lIGhhcyBiZWVuIHRoZSBwcmltYXJ5IHJ1bnRpbWUgcHJpb3IgdG8gdGhpcyBjYWxsLCBhIG5ldwotICAgICAqIHByaW1hcnkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkICh1bmxlc3MgdGhlIGxpc3Qgb2YgdGFyZ2V0Ci0gICAgICogcnVudGltZXMgYmVjb21lcyBlbXB0eSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJpbWFyeSBydW50aW1lIHdpbGwgYmUgc2V0Ci0gICAgICogdG8gPGNvZGU+bnVsbDwvY29kZT4pLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQgYXMgaXQgaXMgbG9uZy0KLSAgICAgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLiBBbHRob3VnaCB0aGlzIGZyYW1ld29yawotICAgICAqIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUgYW5kIHRoZQotICAgICAqIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gcmVtb3ZlCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotICAgICAqICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIGZvciBhbnkgcmVhc29uCi0gICAgICovCi0gICAgCi0gICAgdm9pZCByZW1vdmVUYXJnZXRlZFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogPHA+U2V0cyB0aGUgcHJpbWFyeSB0YXJnZXQgcnVudGltZSBmb3IgdGhpcyBwcm9qZWN0LiBUaGUgbmV3IHByaW1hcnkgaGFzCi0gICAgICogdG8gYmUgb25lIG9mIHRoZSBydW50aW1lcyBjdXJyZW50bHkgdGFyZ2V0ZWQgYnkgdGhlIHByb2plY3QuCi0gICAgICogCi0gICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkIGFzIGl0IGlzIGxvbmctCi0gICAgICogcnVubmluZyBhbmQgbWF5IHRyaWdnZXIgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cy4gQWx0aG91Z2ggdGhpcyBmcmFtZXdvcmsKLSAgICAgKiBpcyBzYWZlLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBvdGhlciBidW5kbGVzIGFyZSBVSS1zYWZlIGFuZCB0aGUKLSAgICAgKiByaXNrIG9mIFVJIGRlYWRsb2NrIGlzIGhpZ2guPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lIHRoZSBuZXcgcHJpbWFyeSBydW50aW1lCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotICAgICAqICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIHByaW1hcnkgcnVudGltZSBpcyBub3Qgb25lIG9mIHRoZSBydW50aW1lcwotICAgICAqICAgY3VycmVudGx5IHRhcmdldGVkIGJ5IHRoZSBwcm9qZWN0OyBpZiBmYWlsZWQgZm9yIGFueSBvdGhlciByZWFzb24KLSAgICAgKi8KLQotICAgIHZvaWQgc2V0UHJpbWFyeVJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKTsKLSAgICAKLSAgICBJTWFya2VyIGNyZWF0ZUVycm9yTWFya2VyKCBTdHJpbmcgbWVzc2FnZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIElNYXJrZXIgY3JlYXRlRXJyb3JNYXJrZXIoIFN0cmluZyB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgSU1hcmtlciBjcmVhdGVXYXJuaW5nTWFya2VyKCBTdHJpbmcgbWVzc2FnZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIElNYXJrZXIgY3JlYXRlV2FybmluZ01hcmtlciggU3RyaW5nIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBhZGRMaXN0ZW5lciggb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RCYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzUyYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUZhY2V0ZWRQcm9qZWN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIG1hbmlwdWxhdGluZyB0aGUgc2V0IG9mIGZhY2V0cyBpbnN0YWxsZWQgb24gYQotICogcHJvamVjdC4gVXNlIHtAbGluayBQcm9qZWN0RmFjZXRzTWFuYWdlciNjcmVhdGUoSVByb2plY3QpfSB0byBnZXQgYW4gaW5zdGFuY2UgCi0gKiBvZiB0aGlzIGludGVyZmFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RCYXNlCi17Ci0gICAgc3RhdGljIGZpbmFsIGludCBQUk9CTEVNX1BST0pFQ1RfTkFNRSA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBQUk9CTEVNX09USEVSID0gLTE7Ci0gICAgCi0gICAgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBmaXhlZCBwcm9qZWN0IGZhY2V0cyBmb3IgdGhpcyBwcm9qZWN0LiBGaXhlZCBmYWNldHMgCi0gICAgICogY2Fubm90IGJlIHVuaW5zdGFsbGVkLCBidXQgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGNhbiBiZSBjaGFuZ2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBmaXhlZCBwcm9qZWN0IGZhY2V0cyBmb3IgdGhpcyBwcm9qZWN0Ci0gICAgICovCi0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXQ+IGdldEZpeGVkUHJvamVjdEZhY2V0cygpOwotICAgIAotICAgIGJvb2xlYW4gaXNGaXhlZFByb2plY3RGYWNldCggSVByb2plY3RGYWNldCBmYWNldCApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBwcm9qZWN0IGZhY2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkIG9uIHRoaXMgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgcHJvamVjdCBmYWNldHMgY3VycmVudGx5IGluc3RhbGxlZCBvbiB0aGlzIHByb2plY3QgCi0gICAgICovCi0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbiggSVByb2plY3RGYWNldCBmICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldCBpcyAKLSAgICAgKiBpbnN0YWxsZWQgb24gdGhpcyBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBwcm9qZWN0IGZhY2V0IGRlc2NyaXB0b3IKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldCAKLSAgICAgKiAgIGlzIGluc3RhbGxlZCBvbiB0aGlzIHByb2plY3QsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGhhc1Byb2plY3RGYWNldCggSVByb2plY3RGYWNldCBmICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjZmllZCBwcm9qZWN0IGZhY2V0IHZlcnNpb24gaXMgaW5zdGFsbGVkIG9uIAotICAgICAqIHRoaXMgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbiBkZXNjcmlwdG9yCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgdmVyc2lvbiBpcyAKLSAgICAgKiAgIGluc3RhbGxlZCBvbiB0aGlzIHByb2plY3QsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGhhc1Byb2plY3RGYWNldCggSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBwcm9qZWN0IChpbiBpdCdzIGN1cnJlbnQgc3RhdGUpIGNhbiBiZSB0YXJnZXRlZCB0byB0aGUgcHJvdmlkZWQKLSAgICAgKiBydW50aW1lLiBUaGlzIGRldGVybWluYXRpb24gaXMgbWFkZSBieSBsb29raW5nIGF0IHRoZSBmYWNldHMgdGhhdCBhcmUgY3VycmVudGx5IGluc3RhbGxlZAotICAgICAqIGFuZCBjaGVja2luZyB0aGVtIGFnYWluc3QgdGhlIHNldCBvZiBmYWNldHMga25vd24gdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBwcm92aWRlZCBydW50aW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIGNoZWNrCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb2plY3QgY2FuIHRhcmdldCB0aGUgcHJvdmlkZWQgcnVudGltZSBhbmQKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiBAc2luY2UgV1RQIDIuMAotICAgICAqLwotICAgIAotICAgIGJvb2xlYW4gaXNUYXJnZXRhYmxlKCBJUnVudGltZSBydW50aW1lICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGN1cnJlbnRseSB0YXJnZXRzIHRoZSBzcGVjaWZpZWQgcnVudGltZS4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcHJvamVjdCBjdXJyZW50bHkgdGFyZ2V0cyB0aGUgc3BlY2lmaWVkIHJ1bnRpbWUgYW5kCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQHNpbmNlIFdUUCAyLjAKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGlzVGFyZ2V0ZWQoIElSdW50aW1lIHJ1bnRpbWUgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5SZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHJ1bnRpbWVzIHRoYXQgdGhpcyBwcm9qZWN0IGlzIHRhcmdldGluZy4gV2hlbiBhCi0gICAgICogcHJvamVjdCB0YXJnZXRzIGEgcnVudGltZSwgdGhlIHNldCBvZiBmYWNldHMgdGhhdCBjYW4gYmUgaW5zdGFsbGVkIGlzCi0gICAgICogbGltaXRlZCB0byB0aG9zZSBzdXBwb3J0ZWQgYnkgdGhhdCBydW50aW1lLiBXaGVuIGEgcHJvamVjdCB0YXJnZXRzCi0gICAgICogbXVsdGlwbGUgcnVudGltZXMsIHRoZSBzZXQgb2YgYXBwbGljYWJsZSBmYWNldHMgaXMgbGltaXRlZCB0byB0aG9zZQotICAgICAqIHN1cHBvcnRlZCBieSBhbGwgdGFyZ2V0ZWQgcnVudGltZXMuPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiB0YXJnZXRlZCBydW50aW1lcwotICAgICAqLwotICAgIAotICAgIFNldDxJUnVudGltZT4gZ2V0VGFyZ2V0ZWRSdW50aW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPlJldHVybnMgdGhlIHByaW1hcnkgdGFyZ2V0IHJ1bnRpbWUgZm9yIHRoaXMgcHJvamVjdC4gVGhlcmUgaXMgYWx3YXlzCi0gICAgICogYSBwcmltYXJ5IHJ1bnRpbWUgdW5sZXNzIHRoZSBsaXN0IG9mIHRhcmdldCBydW50aW1lcyBpcyBlbXB0eS48L3A+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJpbWFyeSBydW50aW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIElSdW50aW1lIGdldFByaW1hcnlSdW50aW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIHZhcmlldHkgb2YgY29uc2lzdGVuY3kgY2hlY2tzIG92ZXIgdGhlIGZhY2V0ZWQgcHJvamVjdC4gVGhlCi0gICAgICogcmVzdWx0IG9mIHRoZSB2YWxpZGF0aW9uIGlzIHJldHVybmVkIGFzIGEgc3RhdHVzIG9iamVjdC4gCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0gICAgICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoaXMKLSAgICAgKiAgIGZhY2V0ZWQgcHJvamVjdCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgCi0gICAgICogICB3cm9uZyB3aXRoIGl0Ci0gICAgICovCi0gICAgCi0gICAgSVN0YXR1cyB2YWxpZGF0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICk7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIHZhcmlldHkgb2YgY29uc2lzdGVuY3kgY2hlY2tzIG92ZXIgdGhlIGZhY2V0ZWQgcHJvamVjdC4gVGhlCi0gICAgICogcmVzdWx0IG9mIHRoZSB2YWxpZGF0aW9uIGlzIHJldHVybmVkIGFzIGEgc3RhdHVzIG9iamVjdC4gVGhpcyBtZXRob2QgaXMKLSAgICAgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdmFsaWRhdGUgd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IHByb2dyZXNzIG1vbml0b3IuIAotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoaXMKLSAgICAgKiAgIGZhY2V0ZWQgcHJvamVjdCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgCi0gICAgICogICB3cm9uZyB3aXRoIGl0Ci0gICAgICovCi0gICAgCi0gICAgSVN0YXR1cyB2YWxpZGF0ZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGVkIGV2ZW50cyBpbiB0aGUgZmFjZXRlZAotICAgICAqIHByb2plY3QgbGlmZSBjeWNsZSBvY2N1ci4gVGhlIGxpc3RlbmVyIHdpbGwgYXBwbHkgb25seSB0byB0aGlzIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIKLSAgICAgKiBAcGFyYW0gdHlwZXMgdGhlIHR5cGVzIG9mIHRoZSBldmVudHMgdG8gbGlzdGVuIGZvcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IKLSAgICAgKiAgIHRoZSA8Y29kZT50eXBlczwvY29kZT4gcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LgotICAgICAqIEBzZWUgI3JlbW92ZUxpc3RlbmVyKElGYWNldGVkUHJvamVjdExpc3RlbmVyKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsjYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsjcmVtb3ZlTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIpCi0gICAgICovCi0gICAgCi0gICAgdm9pZCBhZGRMaXN0ZW5lciggSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS4uLiB0eXBlcyApOwotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lciB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rICNhZGRMaXN0ZW5lcihJRmFjZXRlZFByb2plY3RMaXN0ZW5lcixJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlW10pfSBtZXRob2QuIElmIHRoZQotICAgICAqIHNwZWNpZmllZCBsaXN0ZW5lciBpcyBub3QgcHJlc2VudCBpbiB0aGUgbGlzdGVuZXIgcmVnaXN0cnksIHRoaXMgY2FsbCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5saXN0ZW5lcjwvY29kZT4gcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHNlZSAjYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsjYWRkTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdKQotICAgICAqIEBzZWUgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsjcmVtb3ZlTGlzdGVuZXIoSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIpCi0gICAgICovCi0gICAgCi0gICAgdm9pZCByZW1vdmVMaXN0ZW5lciggSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQwMmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBjbGFzcyBmcm9tIHRoZSBmYWNldC5jb3JlLmV2ZW50cyBwYWNrYWdlCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcgotewotICAgIHZvaWQgcHJvamVjdENoYW5nZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdFRlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI3ZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lGYWNldGVkUHJvamVjdFRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldGVkUHJvamVjdFRlbXBsYXRlCi17Ci0gICAgU3RyaW5nIGdldElkKCk7Ci0gICAgU3RyaW5nIGdldExhYmVsKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGZpeGVkIHByb2plY3QgZmFjZXRzCi0gICAgICovCi0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXQ+IGdldEZpeGVkUHJvamVjdEZhY2V0cygpOwotICAgIElQcmVzZXQgZ2V0SW5pdGlhbFByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyYTk3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgbWFya2VyIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgYWxsIG1hcmtlcnMgcmVwb3J0ZWQKLSAgICAgKiBieSB0aGUgZmFjZXRlZCBwcm9qZWN0IHZhbGlkYXRvci4KLSAgICAgKi8KLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTUFSS0VSX0lECi0gICAgICAgID0gRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIudmFsaWRhdGlvbi5tYXJrZXIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgdm9pZCB2YWxpZGF0ZSggSUZhY2V0ZWRQcm9qZWN0IGZwcm9qICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MmY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weQotCi0gICAgZXh0ZW5kcyBJRmFjZXRlZFByb2plY3RCYXNlCi0gICAgCi17Ci0gICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0gICAgCi0gICAgLy8gT25seSB3b3JrcyBpZiB0aGUgbW9kZWwgd2Fzbid0IGNyZWF0ZWQgYmFzZWQgb24gYW4gZXhpc3RpbmcgcHJvamVjdC4KLSAgICB2b2lkIHNldFByb2plY3ROYW1lKCBTdHJpbmcgbmFtZSApOwotICAgIAotICAgIElQYXRoIGdldFByb2plY3RMb2NhdGlvbigpOwotICAgIHZvaWQgc2V0UHJvamVjdExvY2F0aW9uKCBJUGF0aCBsb2NhdGlvbiApOwotICAgIAotICAgIElGYWNldGVkUHJvamVjdCBnZXRGYWNldGVkUHJvamVjdCgpOwotICAgIAotICAgIE1hcDxJUHJvamVjdEZhY2V0LFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4+IGdldEF2YWlsYWJsZUZhY2V0cygpOwotCi0gICAgYm9vbGVhbiBpc0ZhY2V0QXZhaWxhYmxlKCBJUHJvamVjdEZhY2V0IGYgKTsKLSAgICAKLSAgICBib29sZWFuIGlzRmFjZXRBdmFpbGFibGUoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRBdmFpbGFibGVWZXJzaW9ucyggSVByb2plY3RGYWNldCBmICk7Ci0gICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0SGlnaGVzdEF2YWlsYWJsZVZlcnNpb24oIElQcm9qZWN0RmFjZXQgZiApOwotICAgIAotICAgIHZvaWQgc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKTsKLSAgICAKLSAgICB2b2lkIHNldFByb2plY3RGYWNldHMoIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICk7Ci0gICAgCi0gICAgdm9pZCBhZGRQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICAgCi0gICAgdm9pZCByZW1vdmVQcm9qZWN0RmFjZXQoIElQcm9qZWN0RmFjZXQgZiApOwotICAgIAotICAgIHZvaWQgcmVtb3ZlUHJvamVjdEZhY2V0KCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApOwotICAgIAotICAgIHZvaWQgY2hhbmdlUHJvamVjdEZhY2V0VmVyc2lvbiggSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgICAKLSAgICBTZXQ8SVByZXNldD4gZ2V0QXZhaWxhYmxlUHJlc2V0cygpOwotICAgIAotICAgIElQcmVzZXQgZ2V0U2VsZWN0ZWRQcmVzZXQoKTsKLSAgICAKLSAgICB2b2lkIHNldFNlbGVjdGVkUHJlc2V0KCBTdHJpbmcgcHJlc2V0SWQgKTsKLSAgICAKLSAgICBJUHJlc2V0IGdldERlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0gICAgCi0gICAgSVByZXNldCBnZXRNaW5pbWFsQ29uZmlndXJhdGlvbigpOwotCi0gICAgU2V0PElSdW50aW1lPiBnZXRUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAKLSAgICB2b2lkIHJlZnJlc2hUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAKLSAgICB2b2lkIHNldFRhcmdldGVkUnVudGltZXMoIFNldDxJUnVudGltZT4gcnVudGltZXMgKTsKLSAgICAKLSAgICB2b2lkIGFkZFRhcmdldGVkUnVudGltZSggSVJ1bnRpbWUgcnVudGltZSApOwotICAgIAotICAgIHZvaWQgcmVtb3ZlVGFyZ2V0ZWRSdW50aW1lKCBJUnVudGltZSBydW50aW1lICk7Ci0gICAgCi0gICAgdm9pZCBzZXRQcmltYXJ5UnVudGltZSggSVJ1bnRpbWUgcnVudGltZSApOwotICAgIAotICAgIFNldDxBY3Rpb24+IGdldFByb2plY3RGYWNldEFjdGlvbnMoKTsKLSAgICAKLSAgICBBY3Rpb24gZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBJUHJvamVjdEZhY2V0IGZhY2V0ICk7Ci0gICAgCi0gICAgdm9pZCBzZXRQcm9qZWN0RmFjZXRBY3Rpb25Db25maWcoIElQcm9qZWN0RmFjZXQgZmFjZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdBY3Rpb25Db25maWcgKTsgICAgCi0gICAgCi0gICAgdm9pZCBjb21taXRDaGFuZ2VzKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICB2b2lkIG1lcmdlQ2hhbmdlcyggSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgKTsKLSAgICAKLSAgICB2b2lkIHJldmVydENoYW5nZXMoKTsKLSAgICAKLSAgICBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBjbG9uZSgpOwotICAgIAotICAgIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzk3MmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSBncm91cCBpcyBhIG5hbWVkIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufSAgb2JqZWN0cy4gSXQgaXMgCi0gKiB1c2VkIHByaW1hcmlseSBhcyBhIHBhcmFtZXRlciB0byB0aGUgInJlcXVpcmVzIiBhbmQgImNvbmZsaWN0cyIgY29uc3RyYWludHMgCi0gKiBhbmQgYWxsb3dzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gd2hlcmUgYSBmYWNldCBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgCi0gKiBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBBIGdpdmVuIHByb2plY3QgZmFjZXQgdmVyc2lvbiBjYW4gYmVsb25nIHRvIAotICogc2V2ZXJhbCBncm91cHMuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUdyb3VwIAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhpcyBncm91cAotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyb3VwIGxhYmVsLiBUaGUgbGFiZWwgc2hvdWxkIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nIHRoZQotICAgICAqIGdyb3VwIHRvIHRoZSB1c2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGdyb3VwIGxhYmVsCi0gICAgICovCi0KLSAgICBTdHJpbmcgZ2V0TGFiZWwoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBncm91cCBkZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBncm91cCBkZXNjcmlwdGlvbgotICAgICAqLwotCi0gICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIG1lbWJlciBwcm9qZWN0IGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgbWVtYmVyIHByb2plY3QgZmFjZXRzCi0gICAgICovCi0gICAgCi0gICAgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRNZW1iZXJzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NzAzYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUxpc3RlbmVyCi17Ci0gICAgdm9pZCBoYW5kbGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcmVzZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcmVzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1ZGRkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUHJlc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSBwcmVzZXQgaXMgYSB1c2VyIGNvbnZlbmllbmNlIG1lY2hhbmlzbSBmb3IgcXVpY2tseSBzZWxlY3RpbmcgYSBwcmVkZWZpbmVkIHNldCBvZiBwcm9qZWN0IAotICogZmFjZXRzLiBQcmVzZXRzIGNhbiBiZSBkZWZpbmVkIGJ5IHBsdWdpbiB3cml0ZXJzIHRocm91Z2ggdGhlIHN1cHBsaWVkIDxjb2RlPnByZXNldHM8L2NvZGU+IAotICogZXh0ZW5zaW9uIHBvaW50IGFzIHdlbGwgYXMgYnkgZW5kIHVzZXJzLiBVc2VyLWRlZmluZWQgcHJlc2V0cyBhcmUgc3RvcmVkIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByZXNldAotewotICAgIC8qKgotICAgICAqIFRoZSBlbnVtYmVyYXRpb24gb2YgcHJlc2V0IHR5cGVzLgotICAgICAqIAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICAKLSAgICBlbnVtIFR5cGUKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGF0aWMgcHJlc2V0cyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgPGNvZGU+cHJlc2V0czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IGFuZCBhcmUgZnVsbHkKLSAgICAgICAgICogc3BlY2lmaWVkIGluIHRoZSBleHRlbnNpb24gcG9pbnQuIAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIFNUQVRJQywKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEeW5hbWljIHByZXNldHMgYXJlIGNyZWF0ZWQgYnkgcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGluIHRoZSA8Y29kZT5wcmVzZXRzPC9jb2RlPgotICAgICAgICAgKiBleHRlbnNpb24gcG9pbnQgYW5kIGFyZSBub3QgZnVsbHkgc3BlY2lmaWVkIHVudGlsIHRoZXkgYXJlIHJlc29sdmVkIHdpdGhpbiB0aGUgY29udGV4dAotICAgICAgICAgKiBvZiB1c2UuIFRvIHJlc29sdmUgYSBkeW5hbWljIHByZXNldCwgY2FzdCB0aGUgcHJlc2V0IG9iamVjdCB0byB7QGxpbmsgSUR5bmFtaWNQcmVzZXR9IGFuZAotICAgICAgICAgKiB0aGVuIHVzZSB0aGUge0BsaW5rIElEeW5hbWljUHJlc2V0I3Jlc29sdmUoamF2YS51dGlsLk1hcCl9IG1ldGhvZC4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgRFlOQU1JQywKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VyIHByZXNldHMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIDxjb2RlPlByb2plY3RGYWNldHNNYW5hZ2VyLmRlZmluZVByZXNldCgpPC9jb2RlPgotICAgICAgICAgKiBtZXRob2RzIGFuZCBhcmUgc3RvcmVkIGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgVVNFUl9ERUZJTkVECi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBwcmVzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHByZXNldAotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHByZXNldC4gSWYgdGhlIHByZXNldCB0eXBlIGlzIHtAbGluayBUeXBlI0RZTkFNSUN9LCB0aGVuIHRoZSBwcmVzZXQKLSAgICAgKiBvYmplY3QgY2FuIGJlIGNhc3QgdG8ge0BsaW5rIElEeW5hbWljUHJlc2V0fS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBwcmVzZXQKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgCi0gICAgVHlwZSBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYWJlbCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcHJlc2VudGluZyB0aGUgcHJlc2V0IHRvIHRoZSB1c2VyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZXNldCBsYWJlbAotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRMYWJlbCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHByZXNldAotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgZmFjZXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBwcmVzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiBwcm9qZWN0IGZhY2V0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgcHJlc2V0Ci0gICAgICovCi0KLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJlc2V0IGlzIHVzZXIgZGVmaW5lZC4gQSB1c2VyLWRlZmluZWQgcHJlc2V0IGlzCi0gICAgICogc3RvcmVkIGluIHRoZSB3b3Jrc3BhY2UgYW5kIGNhbiBiZSBkZWxldGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZXNldCBpcyB1c2VyLWRlZmluZWQsCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgI2dldFR5cGUoKX0gbWV0aG9kIGluc3RlYWQKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGlzVXNlckRlZmluZWQoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcmVzZXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUHJlc2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWY1NjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcmVzZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgcHJlc2V0IGZhY3RvcnkgaXMgdXNlZCBmb3IgY3JlYXRpbmcgYSBkeW5hbWljIHByZXNldC4gVW5saWtlIGEgc3RhdGljIHByZXNldCwgd2hpY2ggaXMgZnVsbHkKLSAqIHNwZWNpZmllZCBmcm9tIHRoZSBzdGFydCwgYSBkeW5hbWljIHByZXNldCB1c2VzIGEgZmFjdG9yeSB0byBzeW50aGVzaXplIHRoZSBwcmVzZXQgZGVmaW5pdGlvbiBvbiAKLSAqIHRoZSBmbHkgYmFzZWQgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgd2lsbCBiZSB1c2VkLiAKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUHJlc2V0RmFjdG9yeQotewotICAgIC8qKgotICAgICAqIFRoZSBmYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBwcmVzZXQgZGVmaW5pdGlvbi4gVGhlIGRlZmluaXRpb24gY29udGFpbnMgYWxsIG9mIHRoZSAKLSAgICAgKiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHRoZSBzeXN0ZW0gdG8gY3JlYXRlIGEgcHJlc2V0LiBUaGUgZmFjdG9yeSBjYW4gdGFrZSBpbnRvIGFjY291bnQgCi0gICAgICogdGhlIGNvbnRleHQgdGhhdCB0aGUgcHJlc2V0IHdpbGwgYmUgdXNlZCBpbiB3aGVuIGNyZWF0aW5nIGEgcHJlc2V0IGRlZmluaXRpb24uIFNlZQotICAgICAqIHtAbGluayBJRHluYW1pY1ByZXNldH0gZm9yIGRvY3VtZW50YXRpb24gb24gd2hhdCB0eXBlIG9mIGluZm9ybWF0aW9uIHRoZSBjb250ZXh0IGNhbiBjb250YWluLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZXNldElkIHRoZSBpZCBvZiB0aGUgcHJlc2V0Ci0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGluZm9ybWF0aW9uIGFib3V0IGNvbnRleHQgdGhhdCB0aGlzIHByZXNldCB3aWxsIGJlIHVzZWQgaW4KLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHByZXNldCBkZWZpbml0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZmFjdG9yeSBpcyBub3QgYXBwbGljYWJsZSAKLSAgICAgKiAgIHRvIHRoZSBwcm92aWRlZCBjb250ZXh0Ci0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCB3aGlsZSBjcmVhdGluZyB0aGUgcHJlc2V0IGRlZmluaXRpb24KLSAgICAgKi8KLSAgICAKLSAgICBQcmVzZXREZWZpbml0aW9uIGNyZWF0ZVByZXNldCggU3RyaW5nIHByZXNldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4gY29udGV4dCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByb2plY3RGYWNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByb2plY3RGYWNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWMzMzBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lQcm9qZWN0RmFjZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBDb250YWlucyBtZXRhZGF0YSB0aGF0IGRlc2NyaWJlcyBhIHByb2plY3QgZmFjZXQuIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCAKLSAqIGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RGYWNldAotCi0gICAgZXh0ZW5kcyBJQWRhcHRhYmxlCi0gICAgCi17Ci0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQncyB1c2VkIGZvciBzdWdnZXN0aW5nIHRvIHRoZSBmcmFtZXdvcmsgdGhhdCB0aGlzIGZhY2V0J3MKLSAgICAgKiB2ZXJzaW9uIGRvZXMgbm90IGNvbnZleSBhIHNwZWNpYWwgbWVhbmluZyBhbmQgc2hvdWxkIGJlIGhpZGRlbiB3aGVyZSBwb3NzaWJsZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0hJREVfVkVSU0lPTiA9ICJoaWRlLnZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvamVjdCBmYWNldCBpZGVudGlmaWVyLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGZhY2V0IGlkZW50aWZpZXIKLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhhdCBkZWZpbmVzIHRoaXMgcHJvamVjdCBmYWNldC4gVGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGZhY2V0IGlzIG5vdCBkZWZpbmVkLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgZGVmaW5lcyB0aGlzIHByb2plY3QgZmFjZXQsIG9yCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRQbHVnaW5JZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgZmFjZXQgbGFiZWwuIFRoZSBsYWJlbCBzaG91bGQgYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcKLSAgICAgKiB0aGUgcHJvamVjdCBmYWNldCB0byB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGZhY2V0IGxhYmVsCi0gICAgICovCi0KLSAgICBTdHJpbmcgZ2V0TGFiZWwoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0IGRlc2NyaXB0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgZmFjZXQgZGVzY3JpcHRpb24KLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhdGVnb3J5LCBpZiBhbnksIHRoYXQgdGhpcyBwcm9qZWN0IGZhY2V0IGJlbG9uZ3MgdG8uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2F0ZWdvcnkgdGhhdCB0aGlzIHByb2plY3QgZmFjZXQgYmVsb25ncyB0bywgb3IgCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIElDYXRlZ29yeSBnZXRDYXRlZ29yeSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3JzIG9mIGFsbCB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QgZmFjZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvcnMgb2YgYWxsIHZlcnNpb25zIG9mIHRoaXMgcHJvamVjdCBmYWNldAotICAgICAqLwotICAgIAotICAgIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0VmVyc2lvbnMoKTsKLSAgICAKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFZlcnNpb25zKCBTdHJpbmcgZXhwciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHByb2plY3QgZmFjZXQgdmVyc2lvbiBleGlzdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmYWNldCB2ZXJzaW9uIGV4aXN0cywKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGhhc1ZlcnNpb24oIFN0cmluZyB2ZXJzaW9uICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gcHJvamVjdCBmYWNldCB2ZXJzaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIHN0cmluZwotICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIHByb2plY3QgZmFjZXQgdmVyc2lvbiwgb3IgCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgICAgICAKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRWZXJzaW9uKCBTdHJpbmcgdmVyc2lvbiApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgZXhpc3RzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHByb2plY3QgZmFjZXQKLSAgICAgKi8KLSAgICAKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRMYXRlc3RWZXJzaW9uKCkKLSAgICAKLSAgICAJdGhyb3dzIFZlcnNpb25Gb3JtYXRFeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUKLSAgICAgKiBnaXZlbiBydW50aW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lCi0gICAgICogQHJldHVybiByZXR1cm5zIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBmYWNldCB0aGF0IGlzIHN1cHBvcnRlZAotICAgICAqICAgYnkgdGhlIGdpdmVuIHJ1bnRpbWUKLSAgICAgKi8KLSAgICAKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uKCBJUnVudGltZSBydW50aW1lICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmFjZXQgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LiBJZiB0aGUKLSAgICAgKiBkZWZhdWx0IHZlcnNpb24gaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHRoZSBmYWNldCBkZWZpbml0aW9uLCB0aGUKLSAgICAgKiBsYXRlc3QgdmVyc2lvbiAoYXMgc3BlY2lmaWVkIGJ5IHtAbGluayAjZ2V0TGF0ZXN0VmVyc2lvbigpfSBtZXRob2QpIHdpbGwKLSAgICAgKiBiZSByZXR1cm5lZC4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmFjZXQgdmVyc2lvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0Ci0gICAgICovCi0gICAgCi0gICAgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdFZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBjb250YWluaW5nIHRoZSBkZXNjcmlwdG9ycyBvZiBhbGwgdmVyc2lvbnMgb2YgdGhpcyAKLSAgICAgKiBwcm9qZWN0IGZhY2V0LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXNjZW5kaW5nIHdoZXRoZXIgdmVyc2lvbiBkZXNjcmlwdG9ycyBzaG91bGQgYmUgc29ydGVkIGluIAotICAgICAqICAgYXNjZW5kaW5nIG9yZGVyCi0gICAgICogQHJldHVybiBhIHNvcnRlZCBsaXN0IGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0b3JzIG9mIGFsbCB2ZXJzaW9ucyBvZiB0aGlzIAotICAgICAqICAgcHJvamVjdCBmYWNldAotICAgICAqLwotICAgIAotICAgIExpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFNvcnRlZFZlcnNpb25zKCBib29sZWFuIGFzY2VuZGluZyApCi0gICAgCi0gICAgICAgIHRocm93cyBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gY29tcGFyYXRvciBzcGVjaWZpZWQgZm9yIHRoaXMgcHJvamVjdCBmYWNldC4gSWYgbm8gCi0gICAgICogdmVyc2lvbiBjb21wYXJhdG9yIGlzIHNwZWNpZmllZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgCi0gICAgICogdGhlIHtAbGluayBEZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3J9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gY29tcGFyYXRvciBzcGVjaWZpZWQgZm9yIHRoaXMgcHJvamVjdCBmYWNldAotICAgICAqLwotICAgIAotICAgIENvbXBhcmF0b3I8U3RyaW5nPiBnZXRWZXJzaW9uQ29tcGFyYXRvcigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgdGhhdCBzcGVjaWZ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgZmFjZXQuIFNvbWUgb2YKLSAgICAgKiB0aGUgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgcHJvY2Vzc2VkIGJ5IHRoZSBmYWNldGVkIHByb2plY3QgZnJhbWV3b3JrLCB3aGlsZSBvdGhlcnMKLSAgICAgKiBhcmUgdGhlcmUgZm9yIHRoZSBiZW5lZml0IG9mIGZyYW1ld29yaydzIHVzZXJzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBwcm9qZWN0IGZhY2V0Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIAotICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgbmFtZS4gUHJvcGVydGllcyBzcGVjaWZ5IGFkZGl0aW9uYWwKLSAgICAgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBmYWNldC4gU29tZSBvZiB0aGUgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgcHJvY2Vzc2VkIGJ5IHRoZQotICAgICAqIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmssIHdoaWxlIG90aGVycyBhcmUgdGhlcmUgZm9yIHRoZSBiZW5lZml0IG9mIGZyYW1ld29yaydzIHVzZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgZ2V0UHJvcGVydHkoIFN0cmluZyBuYW1lICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUHJvamVjdEZhY2V0VmVyc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVByb2plY3RGYWNldFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmMTFkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUHJvamVjdEZhY2V0VmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotCi0vKioKLSAqIENvbnRhaW5zIG1ldGFkYXRhIHRoYXQgZGVzY3JpYmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBhIHByb2plY3QgZmFjZXQuIFRoaXMgCi0gKiBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RGYWNldFZlcnNpb24KLQotICAgIGV4dGVuZHMgQ29tcGFyYWJsZSwgSVZlcnNpb24KLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IGZhY2V0IGRlc2NyaXB0b3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBmYWNldCBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgCi0gICAgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIHN0cmluZwotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGRlZmluZXMgdGhpcyBwcm9qZWN0IGZhY2V0IHZlcnNpb24uIAotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgdmVyc2lvbiBpcyBub3QgZGVmaW5lZC4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGRlZmluZXMgdGhpcyBwcm9qZWN0IGZhY2V0IHZlcnNpb24sIG9yCi0gICAgICogICA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRQbHVnaW5JZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnN0cmFpbnQgdGhhdCBoYXMgdG8gYmUgc2F0aXNmaWVkIHByaW9yIHRvIGluc3RhbGxpbmcgdGhpcwotICAgICAqIHByb2plY3QgZmFjZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29uc3RyYWludCB0aGF0IGhhcyB0byBiZSBzYXRpc2ZpZWQgcHJpb3IgdG8gaW5zdGFsbGluZyB0aGlzIAotICAgICAqICAgcHJvamVjdCBmYWNldAotICAgICAqLwotICAgIAotICAgIElDb25zdHJhaW50IGdldENvbnN0cmFpbnQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGZhY2V0IHZlcnNpb24gc3VwcG9ydHMgYSBwYXJ0aWN1bGFyIAotICAgICAqIGFjdGlvbiB0eXBlLiBGb3IgaW5zdGFuY2UsIHNvbWUgcHJvamVjdCBmYWNldHMgbWF5IG5vdCBiZSB1bmluc3RhbGxhYmxlLCAKLSAgICAgKiBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBub3Qgc3VwcG9ydCA8Y29kZT5BY3Rpb24uVHlwZS5VTklOU1RBTEw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYXNlIHRoZSBzZXQgb2YgZmFjZXRzIGN1cnJlbnRseSBpbnN0YWxsZWQgaW4gdGhlIHByb2plY3QgdGhhdAotICAgICAqICAgdGhlIGRlc2lyZWQgYWN0aW9uIHR5cGUgd291bGQgYmUgZXhlY3V0ZWQgYWdhaW5zdAotICAgICAqIEBwYXJhbSB0eXBlIGFjdGlvbiB0eXBlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGlzIHByb2plY3QgZmFjZXQgc3VwcG9ydHMgdGhlIAotICAgICAqICAgcHJvdmlkZWQgYWN0aW9uIHR5cGUKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIHN1cHBvcnRzKCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgQWN0aW9uLlR5cGUgdHlwZSApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbiBzdXBwb3J0cyBhIHBhcnRpY3VsYXIgCi0gICAgICogYWN0aW9uIHR5cGUuIEZvciBpbnN0YW5jZSwgc29tZSBwcm9qZWN0IGZhY2V0cyBtYXkgbm90IGJlIHVuaW5zdGFsbGFibGUsIAotICAgICAqIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsIG5vdCBzdXBwb3J0IDxjb2RlPkFjdGlvbi5UeXBlLlVOSU5TVEFMTDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgYWN0aW9uIHR5cGUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcHJvamVjdCBmYWNldCBzdXBwb3J0cyB0aGUgcHJvdmlkZWQgCi0gICAgICogICBhY3Rpb24gdHlwZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3N1cHBvcnRzKCBTZXQsIElGYWNldGVkUHJvamVjdC5BY3Rpb24uVHlwZSl9IGluc3RlYWQKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIHN1cHBvcnRzKCBBY3Rpb24uVHlwZSB0eXBlICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIGFjdGlvbiBkZWZpbml0aW9ucyBmb3IgdGhpcyBwcm9qZWN0IGZhY2V0IHZlcnNpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBhbGwgb2YgdGhlIGFjdGlvbiBkZWZpbml0aW9ucyBmb3IgdGhpcyBwcm9qZWN0IGZhY2V0IHZlcnNpb24KLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IGdldEFjdGlvbkRlZmluaXRpb25zKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWN0aW9uIGRlZmluaXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIGFjdGlvbiB0eXBlCi0gICAgICogb3ZlciB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbi4gRm9yIDxjb2RlPklOU1RBTEw8L2NvZGU+IGFuZAotICAgICAqIDxjb2RlPlVOSU5TVEFMTDwvY29kZT4gYWN0aW9uIHR5cGVzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHNldCBvZgotICAgICAqIGxlbmd0aCAwIG9yIDEuIEZvciA8Y29kZT5WRVJTSU9OX0NIQU5HRTwvY29kZT4gYWN0aW9uIHR5cGUsIHRoZSByZXR1cm5lZAotICAgICAqIHNldCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIGl0ZW0gYXMgdGhlcmUgbWF5IGV4aXN0IG11bHRpcGxlIGFjdGlvbgotICAgICAqIGRlZmluaXRpb25zIGZvciBjb252ZXJ0aW5nIGZyb20gdmFyaW91cyB2ZXJzaW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSBhY3Rpb24gdHlwZQotICAgICAqIEByZXR1cm4gYSBzZXQgY29udGFpbmluZyBhY3Rpb24gZGVmaW5pdGlvbnMgY29ycmVzcG9uZGluZyB0byBhIHBhcnRpY3VsYXIKLSAgICAgKiAgIGFjdGlvbiB0eXBlIG92ZXIgdGhpcyBwcm9qZWN0IGZhY2V0IHZlcnNpb24gCi0gICAgICovCi0gICAgCi0gICAgU2V0PElBY3Rpb25EZWZpbml0aW9uPiBnZXRBY3Rpb25EZWZpbml0aW9ucyggQWN0aW9uLlR5cGUgdHlwZSApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjdGlvbiBkZWZpbml0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIGFjdGlvbiB0eXBlCi0gICAgICogb3ZlciB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbi4gVGhlIHtAbGluayAjc3VwcG9ydHMoIFNldCwgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlICl9IAotICAgICAqIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBhY3Rpb24gaXMgc3VwcG9ydGVkIHByaW9yIHRvCi0gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZSB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgaW5zdGFsbGVkIGluIHRoZSBwcm9qZWN0IHRoYXQKLSAgICAgKiAgIHRoZSBkZXNpcmVkIGFjdGlvbiB0eXBlIHdvdWxkIGJlIGV4ZWN1dGVkIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gdHlwZSBhY3Rpb24gdHlwZQotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiBkZWZpbml0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIGFjdGlvbiB0eXBlCi0gICAgICogICBvdmVyIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgcHJvamVjdCBmYWNldCB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gICAgICogICBwcm92aWRlZCBhY3Rpb24gdHlwZQotICAgICAqLwotICAgIAotICAgIElBY3Rpb25EZWZpbml0aW9uIGdldEFjdGlvbkRlZmluaXRpb24oIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24uVHlwZSB0eXBlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29uZmlnIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIGFjdGlvbiBvbiB0aGlzIGZhY2V0LiBXaWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYWN0aW9uIAotICAgICAqIHJlcXVpcmVzIG5vIGNvbmZpZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgYWN0aW9uLgotICAgICAqIEBwYXJhbSBwam5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIGFjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkCi0gICAgICogICBvbgotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiBjb25maWcgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICAgICAqICAgc3BlY2lmaWVkIGFjdGlvbiB0eXBlIG9yIGlmIGZhaWxlZCB3aGlsZSBjcmVhdGluZyB0aGUgYWN0aW9uIGNvbmZpZwotICAgICAqICAgb2JqZWN0Ci0gICAgICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2Qgd2lsbCBub3QgYmVoYXZlIGNvcnJlY3RseSBpbiBwcmVzZW5jZSBvZiBtdWx0aXBsZQotICAgICAqIGFjdGlvbiBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIGFzIGNhbiBiZSB0aGUgY2FzZSB3aXRoIFZFUlNJT05fQ0hBTkdFCi0gICAgICogYWN0aW9uczsgaW5zdGVhZCB1c2UgSUFjdGlvbkRlZmluaXRpb24uY3JlYXRlQ29uZmlnT2JqZWN0KCkKLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgY3JlYXRlQWN0aW9uQ29uZmlnKCBBY3Rpb24uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwam5hbWUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZWhhdmUgY29ycmVjdGx5IGluIHByZXNlbmNlIG9mIG11bHRpcGxlCi0gICAgICogYWN0aW9uIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHR5cGUgYXMgY2FuIGJlIHRoZSBjYXNlIHdpdGggVkVSU0lPTl9DSEFOR0UKLSAgICAgKiBhY3Rpb25zOyBpbnN0ZWFkIGNvbXBhcmUgYXBwcm9wcmlhdGUgSUFjdGlvbkRlZmluaXRpb24gb2JqZWN0cyBkaXJlY3RseSAKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGlzU2FtZUFjdGlvbkNvbmZpZyggQWN0aW9uLlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBmYWNldCB2ZXJzaW9uIGlzIHZhbGlkIGZvciBwcm9qZWN0cyB0aGF0IGhhdmUKLSAgICAgKiB0aGUgcHJvdmlkZWQgc2V0IG9mIGZpeGVkIGZhY2V0cy4gVGhlIGRldGVybWluYXRpb24gaXMgZG9uZSBieSBjaGVja2luZyAKLSAgICAgKiB0byBzZWUgd2hldGhlciB0aGlzIGZhY2V0IG9yIGFueSBvZiBpdHMgZGVwZW5kZW5jaWVzIGFyZSBpbiBjb25mbGljdCB3aXRoCi0gICAgICogYW55IG9mIHRoZSBmaXhlZCBmYWNldHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpeGVkIHRoZSBzZXQgb2YgZml4ZWQgZmFjZXRzCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZhY2V0IHZlcnNpb24gaXMgdmFsaWQgZm9yIHRoZSBwcm9qZWN0cwotICAgICAqICAgdGhhdCBoYXZlIHRoZSBwcm92aWRlZCBzZXQgb2YgZml4ZWQgZmFjZXRzCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBpc1ZhbGlkRm9yKCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKTsKLSAgICAKLSAgICBib29sZWFuIGNvbmZsaWN0c1dpdGgoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc3BlY2lmeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIGZhY2V0IHZlcnNpb24uIAotICAgICAqIFNvbWUgb2YgdGhlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHByb2Nlc3NlZCBieSB0aGUgZmFjZXRlZCBwcm9qZWN0IGZyYW1ld29yaywgd2hpbGUgCi0gICAgICogb3RoZXJzIGFyZSB0aGVyZSBmb3IgdGhlIGJlbmVmaXQgb2YgZnJhbWV3b3JrJ3MgdXNlcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHByb2plY3QgZmFjZXQgdmVyc2lvbgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIG5hbWUuIFByb3BlcnRpZXMgc3BlY2lmeSBhZGRpdGlvbmFsCi0gICAgICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgZmFjZXQgdmVyc2lvbi4gU29tZSBvZiB0aGUgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgcHJvY2Vzc2VkCi0gICAgICogYnkgdGhlIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmssIHdoaWxlIG90aGVycyBhcmUgdGhlcmUgZm9yIHRoZSBiZW5lZml0IG9mIGZyYW1ld29yaydzIAotICAgICAqIHVzZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgZ2V0UHJvcGVydHkoIFN0cmluZyBuYW1lICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUnVudGltZUNoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVJ1bnRpbWVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1NmRmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JUnVudGltZUNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBydW50aW1lIGNoYW5nZWQgZXZlbnQgdG8gdGhlIFJVTlRJTUVfQ0hBTkdFRCBldmVudCBoYW5kbGVycy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKiBAZGVwcmVjYXRlZCB1c2UgdGhlIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGNsYXNzIGZyb20gdGhlIGZhY2V0LmNvcmUuZXZlbnRzIHBhY2thZ2UgaW5zdGVhZAotICogICBvZiB0aGUgZXZlbnQgaGFuZGxlciBleHRlbnNpb24gcG9pbnQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lQ2hhbmdlZEV2ZW50Ci17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXRPbGRSdW50aW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSB0aGF0J3Mgbm93IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIHRoYXQncyBub3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LCBvcgotICAgICAqICAgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXROZXdSdW50aW1lKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JVmVyc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvSVZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0YWZiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gQ2xpZW50IGNvZGUgc2hvdWxkIG9ubHkKLSAqIHJlZmVyZW5jZSA8Y29kZT5JUHJvamVjdEZhY2V0VmVyc2lvbjwvY29kZT4gYW5kIDxjb2RlPklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjwvY29kZT4sCi0gKiB3aGljaCBleHRlbmQgdGhpcyBpbnRlcmZhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgSVZlcnNpb24KLQotICAgIGV4dGVuZHMgQ29tcGFyYWJsZQotICAgIAotewotICAgIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9JVmVyc2lvbkV4cHIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lWZXJzaW9uRXhwci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZkNzE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL0lWZXJzaW9uRXhwci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotLyoqCi0gKiBUaGUgY29tcGlsZWQgZm9ybSBvZiBhIHZlcnNpb24gZXhwcmVzc2lvbi4gQSB2ZXJzaW9uIGV4cHJlc3Npb24gaXMgdXNlZCB0bwotICogc3BlY2lmeSBvbmUgb3IgbW9yZSB2ZXJzaW9ucy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVmVyc2lvbkV4cHIKLXsKLSAgICAvKioKLSAgICAgKiBDb250YWlucyB0aGUgc3ltYm9sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB3aWxkY2FyZC4gVGhlIHdpbGRjYXJkIG1hdGNoZXMKLSAgICAgKiBhbnkgdmVyc2lvbi4gTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIHdpbGRjYXJkIHRvIG1hdGNoCi0gICAgICogcGFydCBvZiB0aGUgdmVyc2lvbiBzdHJpbmcuIAotICAgICAqLwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lMRENBUkRfU1lNQk9MID0gIioiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHZlcnNpb24uIFJldHVybnMKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgdmVyc2lvbiBleHByZXNzaW9uIG1hdGNoZXMgdGhlCi0gICAgICogc3BlY2lmaWVkIHZlcnNpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2JqZWN0IHRvIGNoZWNrIGFnYWluc3QgdGhlIHZlcnNpb24gZXhwcmVzc2lvbgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIHZlcnNpb24gZXhwcmVzc2lvbiBtYXRjaGVzCi0gICAgICogICB0aGUgc3BlY2lmaWVkIHZlcnNpb24KLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGNoZWNrKCBJVmVyc2lvbiB2ZXJzaW9uICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBjaGVjayBtZXRob2QgaW5zdGVhZAotICAgICAqLwotICAgICAKLSAgICBib29sZWFuIGV2YWx1YXRlKCBTdHJpbmcgdmVyc2lvbiApOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgaHVtYW4tcmVhZGFibGUgZm9ybSBvZiB0aGUgdmVyc2lvbiBleHByZXNzaW9uIHRoYXQgdXNlcwotICAgICAqIGRlc2NyaXB0aXZlIHRlcm1zIHJhdGhlciB0aGFuIHN5bWJvbHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBodW1hbi1yZWFkYWJsZSBmb3JtIG9mIHRoZSB2ZXJzaW9uIGV4cHJlc3Npb24KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9NaW5pbWFsQ29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL01pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc4OTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL01pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogUHJlc2V0IGZhY3RvcnkgZm9yIHRoZSA8Y29kZT5taW5pbWFsLmNvbmZpZ3VyYXRpb248L2NvZGU+IHByZXNldC4gVGhpcyBwcmVzZXQgb25seSBjb250YWlucwotICogZml4ZWQgZmFjZXRzLiBUaGUgdmVyc2lvbiBvZiB0aGUgZmFjZXRzIGFyZSBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6IAotICogCi0gKiA8b2w+Ci0gKiAgIDxsaT5JZiBhIHJ1bnRpbWUgaXMgc2VsZWN0ZWQsIHRoZSB2ZXJzaW9ucyBhcmUgbG9va2VkIHVwIHVzaW5nIAotICogICAgIHtAbGluayBJUnVudGltZSNnZXREZWZhdWx0RmFjZXRzKFNldCl9LjwvbGk+Ci0gKiAgIDxsaT5JZiBubyBydW50aW1lIGlzIHNlbGVjdGVkLCB0aGlzIHZlcnNpb25zIGFyZSB0aGUgZGVmYXVsdCB2ZXJzaW9ucyBhcyBzcGVjaWZpZWQgCi0gKiAgICAgYnkge0BsaW5rIElQcm9qZWN0RmFjZXQjZ2V0RGVmYXVsdFZlcnNpb24oKX0uCi0gKiA8L29sPgotICogCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTWluaW1hbENvbmZpZ3VyYXRpb25QcmVzZXRGYWN0b3J5Ci0KLSAgICBpbXBsZW1lbnRzIElQcmVzZXRGYWN0b3J5Ci0gICAgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VUX0lEID0gIm1pbmltYWwuY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgUHJlc2V0RGVmaW5pdGlvbiBjcmVhdGVQcmVzZXQoIGZpbmFsIFN0cmluZyBwcmVzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiAKLSAgICAgICAgICAgID0gKElGYWNldGVkUHJvamVjdEJhc2UpIGNvbnRleHQuZ2V0KCBJRHluYW1pY1ByZXNldC5DT05URVhUX0tFWV9GQUNFVEVEX1BST0pFQ1QgKTsKLSAgICAKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZGVmYXVsdEZhY2V0cyAKLSAgICAgICAgICAgID0gRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50LmdldERlZmF1bHRGYWNldHMoIGZwcm9qICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IGZwcm9qLmdldEZpeGVkUHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjZXRzLmFkZCggZmluZFByb2plY3RGYWNldFZlcnNpb24oIGRlZmF1bHRGYWNldHMsIGYgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFByZXNldERlZmluaXRpb24oIFJlc291cmNlcy5wcmVzZXRMYWJlbCwgUmVzb3VyY2VzLnByZXNldERlc2NyaXB0aW9uLCBmYWNldHMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZmluZFByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ICkKLSAgICB7Ci0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmYWNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZnYuZ2V0UHJvamVjdEZhY2V0KCkgPT0gZmFjZXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmdjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXRMYWJlbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlc2V0RGVzY3JpcHRpb247Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBNaW5pbWFsQ29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9NaW5pbWFsQ29uZmlndXJhdGlvblByZXNldEZhY3RvcnkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL01pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmQ2ZTVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL01pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wcmVzZXRMYWJlbCA9IE1pbmltYWwgQ29uZmlndXJhdGlvbgotcHJlc2V0RGVzY3JpcHRpb24gPSBUaGUgbW9zdCBjb25zZXJ2YXRpdmUgc3RhcnRpbmcgcG9pbnQuIE9ubHkgdGhlIHJlcXVpcmVkIGZhY2V0cyBhcmUgaW5zdGFsbGVkLiBBZGRpdGlvbmFsIGZhY2V0cyBjYW4gbGF0ZXIgYmUgaW5zdGFsbGVkIHRvIGFkZCBuZXcgZnVuY3Rpb25hbGl0eSB0byB0aGUgcHJvamVjdC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ByZXNldERlZmluaXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ByZXNldERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjNDgxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9QcmVzZXREZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIHByZXNldCBkZWZpbml0aW9uIGlzIHVzZWQgaW4gc2V2ZXJhbCBjb250ZXh0cyBhcyBhIG1lYW5zIG9mIGRlc2NyaWJpbmcgYSBwcmVzZXQuIEl0IGlzCi0gKiBkaWZmZXJlbnQgZnJvbSB7QGxpbmsgSVByZXNldH0gaW4gdGhhdCB0aGUgcHJlc2V0IGRlZmluaXRpb24gaXMgbm90IGFuIGFjdHVhbCBwcmVzZXQgdGhhdCdzCi0gKiByZWdpc3RlcmVkIHdpdGggdGhlIHN5c3RlbS4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcmVzZXREZWZpbml0aW9uCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0czsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHByZXNldCBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIHByZXNldCB0byB0aGUgdXNlcgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHByZXNldAotICAgICAqIEBwYXJhbSBmYWNldHMgdGhlIGZhY2V0cyB0aGF0IGNvbXByaXNlIHRoZSBwcmVzZXQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgUHJlc2V0RGVmaW5pdGlvbiggZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB0aGlzLmZhY2V0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCBmYWNldHMgKSApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGZhY2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmdiA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGFiZWwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIHByZXNldCB0byB0aGUgdXNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmVzZXQgbGFiZWwKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHByZXNldAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgZmFjZXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBwcmVzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiBwcm9qZWN0IGZhY2V0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgcHJlc2V0Ci0gICAgICovCi0KLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0czsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9Qcm9qZWN0RmFjZXRzTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvUHJvamVjdEZhY2V0c01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0NmVjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9Qcm9qZWN0RmFjZXRzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgcHJvamVjdCBmYWNldCBmcmFtZXdvcmsgQVBJLiBGcm9tIGhlcmUsIHlvdSAKLSAqIGNhbiAoYW1vbmcgb3RoZXIgdGhpbmdzKSBsaXN0IGF2YWlsYWJsZSBwcm9qZWN0IGZhY2V0cyBhbmQgY3JlYXRlIGluc3RhbmNlcyAKLSAqIG9mIHtAbGluayBJRmFjZXRlZFByb2plY3R9LgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdEZhY2V0c01hbmFnZXIgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsIGltcGwgPSBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICBwcml2YXRlIFByb2plY3RGYWNldHNNYW5hZ2VyKCkge30KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHByb2plY3QgZmFjZXRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgb2YgdGhlIGF2YWlsYWJsZSBwcm9qZWN0IGZhY2V0cwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElQcm9qZWN0RmFjZXQ+IGdldFByb2plY3RGYWNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0UHJvamVjdEZhY2V0cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIHByb2plY3QgZmFjZXQgaWQgaXMgcmVjb2duaXplZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBwcm9qZWN0IGZhY2V0Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBmYWNldCBpZCBpcyByZWNvZ25pemVkLCAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UgCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvamVjdCBmYWNldCBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBwcm9qZWN0IGZhY2V0Ci0gICAgICogQHJldHVybiB0aGUgcHJvamVjdCBmYWNldCBkZXNjcmlwdG9yCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaWQgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0IGdldFByb2plY3RGYWNldCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldFByb2plY3RGYWNldCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIGF2YWlsYWJsZSBwcm9qZWN0IGZhY2V0IGFjdGlvbiBkZWZpbml0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBhdmFpbGFibGUgcHJvamVjdCBmYWNldHMgYWN0aW9uCi0gICAgICogICBkZWZpbml0aW9ucwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElBY3Rpb25EZWZpbml0aW9uPiBnZXRBY3Rpb25EZWZpbml0aW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRBY3Rpb25EZWZpbml0aW9ucygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBwcm9qZWN0IGZhY2V0IGFjdGlvbiBpZCBpcyByZWNvZ25pemVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHByb2plY3QgZmFjZXQgYWN0aW9uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBmYWNldCBhY3Rpb24gaWQgaXMgcmVjb2duaXplZCwgCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlIAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGlvbkRlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5pc0FjdGlvbkRlZmluZWQoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgZmFjZXQgYWN0aW9uIGRlZmluaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgCi0gICAgICogc3BlY2lmaWVkIGFjdGlvbiBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBwcm9qZWN0IGZhY2V0IGFjdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgZmFjZXQgYWN0aW9uIGRlZmluaXRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpZCBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElBY3Rpb25EZWZpbml0aW9uIGdldEFjdGlvbkRlZmluaXRpb24oIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRBY3Rpb25EZWZpbml0aW9uKCBpZCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBjYXRlZ29yaWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgb2YgdGhlIGNhdGVnb3JpZXMKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJQ2F0ZWdvcnk+IGdldENhdGVnb3JpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q2F0ZWdvcmllcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIGNhdGVnb3J5IGlkIGlzIHJlY29nbml6ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgY2F0ZWdvcnkKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjYXRlZ29yeSBpZCBpcyByZWNvZ25pemVkLCAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDYXRlZ29yeURlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5pc0NhdGVnb3J5RGVmaW5lZCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F0ZWdvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIGNhdGVnb3J5Ci0gICAgICogQHJldHVybiB0aGUgY2F0ZWdvcnkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpZCBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElDYXRlZ29yeSBnZXRDYXRlZ29yeSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldENhdGVnb3J5KCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBvZiB0aGUgcHJlc2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2V0IGNvbmFpbmluZyBhbGwgb2YgdGhlIHByZXNldHMKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJUHJlc2V0PiBnZXRQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldFByZXNldHMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gcHJlc2V0IGlkIGlzIHJlY29nbml6ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBwcmVzZXQgaWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVzZXQgaWQgaXMgcmVjb2duaXplZCwKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmVzZXREZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuaXNQcmVzZXREZWZpbmVkKCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgcHJlc2V0IGlkCi0gICAgICogQHJldHVybiB0aGUgcHJlc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByZXNldCBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcmVzZXQgZ2V0UHJlc2V0KCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0UHJlc2V0KCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIGEgbmV3IHByZXNldC4gVXNlci1kZWZpbmVkIHByZXNldHMgYXJlIHN0b3JlZCBpbiB0aGUgd29ya3NwYWNlLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlc2V0Ci0gICAgICogQHBhcmFtIGZhY2V0cyB0aGUgc2V0IG9mIHByb2plY3QgZmFjZXRzIHRoYXQgdGhlIHByZXNldCBzaG91bGQgY29udGFpbgotICAgICAqIEByZXR1cm4gdGhlIHByZXNldAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByZXNldCBkZWZpbmVQcmVzZXQoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmRlZmluZVByZXNldCggbmFtZSwgZmFjZXRzICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZXMgYSBuZXcgcHJlc2V0LiBVc2VyLWRlZmluZWQgcHJlc2V0cyBhcmUgc3RvcmVkIGluIHRoZSB3b3Jrc3BhY2UuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVzZXQKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVzZXQKLSAgICAgKiBAcGFyYW0gZmFjZXRzIHRoZSBzZXQgb2YgcHJvamVjdCBmYWNldHMgdGhhdCB0aGUgcHJlc2V0IHNob3VsZCBjb250YWluCi0gICAgICogQHJldHVybiB0aGUgcHJlc2V0Ci0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJlc2V0IGRlZmluZVByZXNldCggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmRlZmluZVByZXNldCggbmFtZSwgZGVzY3JpcHRpb24sIGZhY2V0cyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBwcmVzZXQuIE5vdGUgdGhhdCBvbmx5IHVzZXItZGVmaW5lZCBwcmVzZXRzIGNhbiBiZSBkZWxldGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVzZXQgdGhlIHByZXNldAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZXNldCB3YXMgZGVsZXRlZCwgb3IgCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHByZXNldCB3YXMgbm90IGZvdW5kIG9yIHdhcyBub3QgdXNlci1kZWZpbmVkIAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcmVzZXQoIGZpbmFsIElQcmVzZXQgcHJlc2V0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmRlbGV0ZVByZXNldCggcHJlc2V0ICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBmYWNldGVkIHByb2plY3QgdGVtcGxhdGVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgY29uYWluaW5nIGFsbCBvZiB0aGUgZmFjZXRlZCBwcm9qZWN0IHRlbXBsYXRlcwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElGYWNldGVkUHJvamVjdFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0VGVtcGxhdGVzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIHRlbXBsYXRlIGlkIGlzIHJlY29nbml6ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSB0ZW1wbGF0ZSBpZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRlbXBsYXRlIGlkIGlzIHJlY29nbml6ZWQsCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVtcGxhdGVEZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuaXNUZW1wbGF0ZURlZmluZWQoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZhY2V0ZWQgcHJvamVjdCB0ZW1wbGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSB0ZW1wbGF0ZSBpZAotICAgICAqIEByZXR1cm4gdGhlIGZhY2V0ZWQgcHJvamVjdCB0ZW1wbHRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRUZW1wbGF0ZSggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIGdyb3Vwcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBncm91cHMKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJR3JvdXA+IGdldEdyb3VwcygpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRHcm91cHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBncm91cCBpZCBpcyByZWNvZ25pemVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgZ3JvdXAgaWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBncm91cCBpZCBpcyByZWNvZ25pemVkLCAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cERlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5pc0dyb3VwRGVmaW5lZCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JvdXAgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgZ3JvdXAgaWQKLSAgICAgKiBAcmV0dXJuIHRoZSBncm91cCBkZXNjcmlwdG9yCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdyb3VwIGlkIGlzIG5vdCBmb3VuZCAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElHcm91cCBnZXRHcm91cCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmdldEdyb3VwKCBpZCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEZhY2V0ZWRQcm9qZWN0cygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0RmFjZXRlZFByb2plY3RzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SUZhY2V0ZWRQcm9qZWN0PiBnZXRGYWNldGVkUHJvamVjdHMoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuZ2V0RmFjZXRlZFByb2plY3RzKCBmICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SUZhY2V0ZWRQcm9qZWN0PiBnZXRGYWNldGVkUHJvamVjdHMoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5nZXRGYWNldGVkUHJvamVjdHMoIGZ2ICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB3cmFwcGVyIGFyb3VuZCBhbiA8Y29kZT5JUHJvamVjdDwvY29kZT4gdGhhdCBleHBvc2VzIEFQSSBmb3IKLSAgICAgKiBtYW5pcHVsYXRpbmcgdGhlIHNldCBvZiBwcm9qZWN0IGZhY2V0cyBpbnN0YWxsZWQgb24gYSBwcm9qZWN0LgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gcHJvamVjdCBhbiBFY2xpcHNlIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBJRmFjZXRlZFByb2plY3R9LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5jcmVhdGUoIHByb2plY3QgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Q3JlYXRlcyBhIHdyYXBwZXIgYXJvdW5kIGFuIDxjb2RlPklQcm9qZWN0PC9jb2RlPiB0aGF0IGV4cG9zZXMgQVBJIGZvcgotICAgICAqIG1hbmlwdWxhdGluZyB0aGUgc2V0IG9mIHByb2plY3QgZmFjZXRzIGluc3RhbGxlZCBvbiBhIHByb2plY3QuIFRoZQotICAgICAqIHByb2plY3Qgd2lsbCBiZSBtYWRlIGludG8gYSBmYWNldGVkIHByb2plY3QgaWYgbmVjZXNzYXJ5LjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQgYXMgaXQgaXMgbG9uZy0KLSAgICAgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLiBBbHRob3VnaCB0aGlzIGZyYW1ld29yawotICAgICAqIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUgYW5kIHRoZQotICAgICAqIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC48L3A+Ci0gICAgICogIAotICAgICAqIEBwYXJhbSBwcm9qZWN0IGFuIEVjbGlwc2UgcHJvamVjdAotICAgICAqIEBwYXJhbSBjb252ZXJ0SWZOZWNlc3Nhcnkgd2hldGhlciB0aGUgcHJvamVjdCBzaG91bGQgYmUgY29udmVydGVkIGludG8gYQotICAgICAqICAgZmFjZXRlZCBwcm9qZWN0Ci0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIHJlcG9ydGluZyBhbmQgCi0gICAgICogICBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0fSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY29udmVydElmTmVjZXNzYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gaW1wbC5jcmVhdGUoIHByb2plY3QsIGNvbnZlcnRJZk5lY2Vzc2FyeSwgbW9uaXRvciApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgZmFjZXRlZCBwcm9qZWN0LjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQgYXMgaXQgaXMgbG9uZy0KLSAgICAgKiBydW5uaW5nIGFuZCBtYXkgdHJpZ2dlciByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzLiBBbHRob3VnaCB0aGlzIGZyYW1ld29yawotICAgICAqIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUgYW5kIHRoZQotICAgICAqIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC48L3A+Ci0KLSAgICAgKiBAcGFyYW0gbmFtZSBwcm9qZWN0IG5hbWUKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gCi0gICAgICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciBudWxsIGlmIHByb2dyZXNzIHJlcG9ydGluZyBhbmQgCi0gICAgICogICBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0fQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZSggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGltcGwuY3JlYXRlKCBuYW1lLCBsb2NhdGlvbiwgbW9uaXRvciApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIGFwcGx5aW5nIHRoZSBzcGVjaWZpZWQgc2V0IG9mIGFjdGlvbnMgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIHNldCBvZiBiYXNlIHByb2plY3QgZmFjZXRzLiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBhbGwgdmFsaWRhdGlvbgotICAgICAqIHByb2JsZW1zIHRoYXQgYXJlIGZvdW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2UgdGhlIHNldCBvZiBwcm9qZWN0IGZhY2V0cyB0aGF0IHRoZSBhY3Rpb25zIHdpbGwgYmUgYXBwbGllZCB0bwotICAgICAqIEBwYXJhbSBhY3Rpb25zIHRoZSBzZXQgb2YgYWN0aW9ucyB0byBldmFsdWF0ZQotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgb2Yge0BsaW5rIElTdGF0dXMjT0t9IGlmIGFsbCBvZiB0aGUKLSAgICAgKiAgIGNvbnN0cmFpbnRzIHdlcmUgc2F0aXNmaWVkIG9yIG90aGVyd2lzZSBhIHtAbGluayBNdWx0aVN0YXR1c30gY29tcG9zZWQgb2YKLSAgICAgKiAgIGluZGl2aWR1YWwgc3RhdHVzIG9iamVjdHMgZm9yIGVhY2ggb2YgdGhlIHByb2JsZW1zCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8QWN0aW9uPiBhY3Rpb25zICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbXBsLmNoZWNrKCBiYXNlLCBhY3Rpb25zICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNvcnRzIGFjdGlvbnMgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBzaG91bGQgYmUgYXBwbGllZCB0byBhIHByb2plY3Qgc3VjaAotICAgICAqIHRoYXQgcHJvamVjdCBmYWNldCBjb25zdHJhaW50cyBhcmUgbm90IHZpb2xhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYXNlIHRoZSBzZXQgb2YgcHJvamVjdCBmYWNldHMgdGhhdCB0aGUgYWN0aW9ucyB3aWxsIGJlIGFwcGxpZWQgdG8KLSAgICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgbGlzdCBvZiBhY3Rpb25zIHRvIHNvcnQ7IHRoaXMgbGlzdCB3aWxsIGJlIG1vZGlmaWVkCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJRmFjZXRlZFByb2plY3QuQWN0aW9uPiBhY3Rpb25zICkKLSAgICB7Ci0gICAgICAgIGltcGwuc29ydCggYmFzZSwgYWN0aW9ucyApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ZlcnNpb25Gb3JtYXRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ZlcnNpb25Gb3JtYXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwNTc2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9WZXJzaW9uRm9ybWF0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgZXhjZXB0aW9uIHRoYXQncyB0aHJvd24gd2hlbiB2ZXJzaW9uIHN0cmluZyBjYW5ub3QgYmUgcGFyc2VkLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiAKLSAgICAKLSAgICBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgY29tcGFyYXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwotICAgIAotICAgIHB1YmxpYyBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uKCBmaW5hbCBPYmplY3QgY29tcGFyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24gKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRDb21wYXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmF0b3I7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCBSZXNvdXJjZXMuY291bGROb3RQYXJzZSwgdGhpcy52ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VsZE5vdFBhcnNlOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc5ZDgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL1ZlcnNpb25Gb3JtYXRFeGNlcHRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNvdWxkTm90UGFyc2UgPSBDb3VsZCBub3QgcGFyc2UgInswfSIgd2l0aCB7MX0uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0RXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmRiZWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotCi0vKioKLSAqIFRoZSByb290IGludGVyZmFjZSBvZiBhbGwgZmFjZXRlZCBwcm9qZWN0IGV2ZW50cy4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLXsKLSAgICBlbnVtIFR5cGUKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHdoZW4gZmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGlzIG1vZGlmaWVkIGluCi0gICAgICAgICAqIGFueSB3YXkuIE5vIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2UgaXMgcHJvdmlkZWQuIE5vdGUgdGhhdCB3aGlsZSBsaXN0ZW5pbmcKLSAgICAgICAgICogZm9yIFBST0pFQ1RfTU9ESUZJRUQgZXZlbnRzIGlzIGd1YXJhbnRlZWQgdG8gY2F0Y2ggYWxsIG90aGVyIGV2ZW50cywgdGhlIGludmVyc2UgaXMgbm90Ci0gICAgICAgICAqIHRydWUuIExpc3Rpbmcgb24gYWxsIHRoZSBvdGhlciBldmVudHMgaXMgbm90IGd1YXJhbnRlZWQgdG8gY2F0Y2ggYWxsIFBST0pFQ1RfTU9ESUZJRUQKLSAgICAgICAgICogZXZlbnRzLiBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgYXJlIGNpcmN1bXN0YW5jZXMgd2hlbiB0aGUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlIGRldGFpbHMKLSAgICAgICAgICogYWJvdXQgdGhlIHR5cGUgb2YgdGhlIGNoYW5nZSAoc3VjaCBhcyB3aGVuIHRoZSBmYWNldGVkIHByb2plY3QgbWV0YWRhdGEgZmlsZSBpcyBtb2RpZmllZAotICAgICAgICAgKiBvbiBkaXNrKS4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBQUk9KRUNUX01PRElGSUVELAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgZ2V0cyB0cmlnZ2VyZWQgcmlnaHQgYmVmb3JlIGEgZmFjZXQgaXMgaW5zdGFsbGVkLiBFdmVudHMgb2YgdGhpcyAKLSAgICAgICAgICogdHlwZSBjYW4gYmUgY2FzdCB0byB7QGxpbmsgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwgZGV0YWlscyAKLSAgICAgICAgICogYWJvdXQgdGhlIGNoYW5nZS4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgUFJFX0lOU1RBTEwsCi0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVHlwZSBvZiB0aGUgZXZlbnQgdGhhdCBnZXRzIHRyaWdnZXJlZCByaWdodCBhZnRlciBhIGZhY2V0IGlzIGluc3RhbGxlZC4gRXZlbnRzIG9mIHRoaXMgCi0gICAgICAgICAqIHR5cGUgY2FuIGJlIGNhc3QgdG8ge0BsaW5rIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudH0gaW50ZXJmYWNlIHRvIGdldCBhZGRpdGlvbmFsIGRldGFpbHMgCi0gICAgICAgICAqIGFib3V0IHRoZSBjaGFuZ2UuIAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIFBPU1RfSU5TVEFMTCwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBhIGZhY2V0IGlzIHVuaW5zdGFsbGVkLiBFdmVudHMgb2YgdGhpcyAKLSAgICAgICAgICogdHlwZSBjYW4gYmUgY2FzdCB0byB7QGxpbmsgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwgZGV0YWlscyAKLSAgICAgICAgICogYWJvdXQgdGhlIGNoYW5nZS4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgUFJFX1VOSU5TVEFMTCwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIGEgZmFjZXQgaXMgdW5pbnN0YWxsZWQuIEV2ZW50cyBvZiB0aGlzIAotICAgICAgICAgKiB0eXBlIGNhbiBiZSBjYXN0IHRvIHtAbGluayBJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnR9IGludGVyZmFjZSB0byBnZXQgYWRkaXRpb25hbCBkZXRhaWxzIAotICAgICAgICAgKiBhYm91dCB0aGUgY2hhbmdlLiAKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBQT1NUX1VOSU5TVEFMTCwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBhIGZhY2V0IHZlcnNpb24gaXMgY2hhbmdlZC4gRXZlbnRzIG9mIAotICAgICAgICAgKiB0aGlzIHR5cGUgY2FuIGJlIGNhc3QgdG8ge0BsaW5rIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudH0gaW50ZXJmYWNlIHRvIGdldCBhZGRpdGlvbmFsIAotICAgICAgICAgKiBkZXRhaWxzIGFib3V0IHRoZSBjaGFuZ2UuIAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIFBSRV9WRVJTSU9OX0NIQU5HRSwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIGEgZmFjZXQgdmVyc2lvbiBpcyBjaGFuZ2VkLiBFdmVudHMgb2YgCi0gICAgICAgICAqIHRoaXMgdHlwZSBjYW4gYmUgY2FzdCB0byB7QGxpbmsgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwgCi0gICAgICAgICAqIGRldGFpbHMgYWJvdXQgdGhlIGNoYW5nZS4gCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgUE9TVF9WRVJTSU9OX0NIQU5HRSwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHdoZW4gcHJvamVjdCdzIGZpeGVkIGZhY2V0cyBhcmUgY2hhbmdlZC4gRXZlbnRzCi0gICAgICAgICAqIG9mIHRoaXMgdHlwZSBjYW4gYmUgY2FzdCB0byB7QGxpbmsgSUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50fSBpbnRlcmZhY2UgdG8gZ2V0IGFkZGl0aW9uYWwKLSAgICAgICAgICogZGV0YWlscyBhYm91dCB0aGUgY2hhbmdlLgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIEZJWEVEX0ZBQ0VUU19DSEFOR0VELAotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgc2V0IG9mIHJ1bnRpbWVzIHRoYXQgdGhlIHByb2plY3QgdGFyZ2V0cwotICAgICAgICAgKiBpcyBjaGFuZ2VkLiBFdmVudHMgb2YgdGhpcyB0eXBlIGNhbiBiZSBjYXN0IHRvIHtAbGluayBJVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudH0gCi0gICAgICAgICAqIGludGVyZmFjZSB0byBnZXQgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBjaGFuZ2UuCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCwKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUeXBlIG9mIHRoZSBldmVudCB0aGF0IGdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHByaW1hcnkgdGFyZ2V0ZWQgcnVudGltZSBvZiB0aGUgcHJvamVjdAotICAgICAgICAgKiBpcyBjaGFuZ2VkLiBFdmVudHMgb2YgdGhpcyB0eXBlIGNhbiBiZSBjYXN0IHRvIHtAbGluayBJUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnR9Ci0gICAgICAgICAqIGludGVyZmFjZSB0byBnZXQgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBjaGFuZ2UuIAotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIFBSSU1BUllfUlVOVElNRV9DSEFOR0VELAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBQUk9KRUNUX05BTUVfQ0hBTkdFRCwKLSAgICAgICAgUFJPSkVDVF9GQUNFVFNfQ0hBTkdFRCwKLSAgICAgICAgQVZBSUxBQkxFX0ZBQ0VUU19DSEFOR0VELAotICAgICAgICBBVkFJTEFCTEVfUFJFU0VUU19DSEFOR0VELAotICAgICAgICBTRUxFQ1RFRF9QUkVTRVRfQ0hBTkdFRCwKLSAgICAgICAgQVZBSUxBQkxFX1JVTlRJTUVTX0NIQU5HRUQsCi0gICAgICAgIFRBUkdFVEFCTEVfUlVOVElNRVNfQ0hBTkdFRCwKLSAgICAgICAgVkFMSURBVElPTl9QUk9CTEVNU19DSEFOR0VEOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50Ci0gICAgICovCi0gICAgCi0gICAgVHlwZSBnZXRUeXBlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGFmZmVjdGVkIGZhY2V0ZWQgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhZmZlY3RlZCBmYWNldGVkIHByb2plY3QKLSAgICAgKi8KLSAgICAKLSAgICBJRmFjZXRlZFByb2plY3QgZ2V0UHJvamVjdCgpOwotICAgIAotICAgIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldFdvcmtpbmdDb3B5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTFjNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotLyoqCi0gKiBUaGUgcm9vdCBpbnRlcmZhY2Ugb2YgYWxsIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmsgZXZlbnRzLiAKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudAotewotICAgIGVudW0gVHlwZQotICAgIHsKLSAgICAgICAgUFJFU0VUX0FEREVELAotICAgICAgICBQUkVTRVRfUkVNT1ZFRAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50Ci0gICAgICovCi0gICAgCi0gICAgVHlwZSBnZXRUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWZkMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB0aG9zZSB3aG8gd2lzaCB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgZmFjZXRlZCBwcm9qZWN0IGlzCi0gKiBjaGFuZ2VkLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byByZWdpc3RlciBhIGxpc3RlbmVyOiAoYSkgdXNpbmcgbWV0aG9kcyBvbiB7QGxpbmsgCi0gKiBJRmFjZXRlZFByb2plY3R9LCAoYikgdXNpbmcgbWV0aG9kcyBvbiB7QGxpbmsgRmFjZXRlZFByb2plY3RGcmFtZXdvcmt9LCBvciAoYykgdXNpbmcgdGhlIHByb3ZpZGVkCi0gKiBleHRlbnNpb24gcG9pbnQuIE1ldGhvZCAoYSkgY2F0Y2hlcyBvbmx5IGV2ZW50cyBmb3IgYSBzcGVjaWZpYyBmYWNldGVkIHByb2plY3Qgd2hpbGUgbWV0aG9kcwotICogKGIpIGFuZCAoYykgY2F0Y2ggZXZlbnRzIGZvciBhbGwgZmFjZXRlZCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gbm90aWZ5IHRoZSBsaXN0ZW5lciB0aGF0IGFuIGV2ZW50IGhhcyBvY2N1cnJlZC4KLSAgICAgKiAKLSAgICAgKiA8cD5BbGwgZXZlbnRzIGV4Y2VwdCBmb3IgPGNvZGU+UFJPSkVDVF9NT0RJRklFRDwvY29kZT4gb2YgdGhpcyB0eXBlIGFyZSB0cmlnZ2VyZWQgaW4gdGhlIAotICAgICAqIGxvY2sgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uIHRoYXQgY2F1c2VkIHRoZSBvcmlnaW5hbCBjaGFuZ2UuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSAKLSAgICAgKiBwcm9qZWN0IGhhcyBub3QgY2hhbmdlZCBmdXJ0aGVyIGZyb20gdGhlIHN0YXRlIGl0IHdhcyBpbiBhZnRlciB0aGUgY2hhbmdlIHdhcyBjb21wbGV0ZSwgCi0gICAgICogaG93ZXZlciB0aGUgbGlzdGVuZXIgaXMgdW5hYmxlIHRvIGNhbGwgYW55IG1vZGlmaWVyIG1ldGhvZHMgb24gdGhlIHtAbGluayBJRmFjZXRlZFByb2plY3R9IAotICAgICAqIGludGVyZmFjZS4gVG8gZG8gc28sIHRoZSBsaXN0ZW5lciBtdXN0IHNwaW4gb2ZmIGEgdGhyZWFkLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5JdCBpcyBoaWdobHkgYWR2aXNlZCB0aGF0IGFueSBsaXN0ZW5lciB0aGF0IHBlcmZvcm1zIG5vbi1jcml0aWNhbCBvciBsb25nLXJ1bm5pbmcgdGFza3MgCi0gICAgICogdGhhdCBjYW4gYmUgcGVyZm9ybWVkIGluIHRoZSBiYWNrZ3JvdW5kIChzdWNoIGFzIHVwZGF0aW5nIFVJKSBkbyBzbyBhc3luY2hyb25vdXNseSBieQotICAgICAqIHNwaW5uaW5nIG9mZiBhIHRocmVhZCwgc2NoZWR1bGluZyBhIGpvYiwgZXRjLiBUaGlzIGFsbG93cyB0aGUgb3JpZ2luYWwgbW9kaWZpY2F0aW9uIHRvCi0gICAgICogY29tcGxldGUgZmFzdGVyIHJlc3VsdGluZyBpbiBiZXR0ZXIgcGVyY2VpdmVkIHJlc3BvbnNpdmVuZXNzLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBldmVudAotICAgICAqLwotICAgIAotICAgIHZvaWQgaGFuZGxlRXZlbnQoIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50IGV2ZW50ICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjczYjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRmFjZXRlZFByb2plY3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhvc2Ugd2hvIHdpc2ggdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGZhY2V0ZWQgcHJvamVjdCBpcwotICogY2hhbmdlZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gcmVnaXN0ZXIgYSBsaXN0ZW5lcjogKGEpIHVzaW5nIG1ldGhvZHMgb24ge0BsaW5rIAotICogSUZhY2V0ZWRQcm9qZWN0fSwgKGIpIHVzaW5nIG1ldGhvZHMgb24ge0BsaW5rIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrfSwgb3IgKGMpIHVzaW5nIHRoZSBwcm92aWRlZAotICogZXh0ZW5zaW9uIHBvaW50LiBNZXRob2QgKGEpIGNhdGNoZXMgb25seSBldmVudHMgZm9yIGEgc3BlY2lmaWMgZmFjZXRlZCBwcm9qZWN0IHdoaWxlIG1ldGhvZHMKLSAqIChiKSBhbmQgKGMpIGNhdGNoIGV2ZW50cyBmb3IgYWxsIGZhY2V0ZWQgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcgotewotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIG5vdGlmeSB0aGUgbGlzdGVuZXIgdGhhdCBhbiBldmVudCBoYXMgb2NjdXJyZWQuCi0gICAgICogCi0gICAgICogPHA+QWxsIGV2ZW50cyBleGNlcHQgZm9yIDxjb2RlPlBST0pFQ1RfTU9ESUZJRUQ8L2NvZGU+IG9mIHRoaXMgdHlwZSBhcmUgdHJpZ2dlcmVkIGluIHRoZSAKLSAgICAgKiBsb2NrIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IGNhdXNlZCB0aGUgb3JpZ2luYWwgY2hhbmdlLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgCi0gICAgICogcHJvamVjdCBoYXMgbm90IGNoYW5nZWQgZnVydGhlciBmcm9tIHRoZSBzdGF0ZSBpdCB3YXMgaW4gYWZ0ZXIgdGhlIGNoYW5nZSB3YXMgY29tcGxldGUsIAotICAgICAqIGhvd2V2ZXIgdGhlIGxpc3RlbmVyIGlzIHVuYWJsZSB0byBjYWxsIGFueSBtb2RpZmllciBtZXRob2RzIG9uIHRoZSB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0fSAKLSAgICAgKiBpbnRlcmZhY2UuIFRvIGRvIHNvLCB0aGUgbGlzdGVuZXIgbXVzdCBzcGluIG9mZiBhIHRocmVhZC48L3A+Ci0gICAgICogCi0gICAgICogPHA+SXQgaXMgaGlnaGx5IGFkdmlzZWQgdGhhdCBhbnkgbGlzdGVuZXIgdGhhdCBwZXJmb3JtcyBub24tY3JpdGljYWwgb3IgbG9uZy1ydW5uaW5nIHRhc2tzIAotICAgICAqIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBpbiB0aGUgYmFja2dyb3VuZCAoc3VjaCBhcyB1cGRhdGluZyBVSSkgZG8gc28gYXN5bmNocm9ub3VzbHkgYnkKLSAgICAgKiBzcGlubmluZyBvZmYgYSB0aHJlYWQsIHNjaGVkdWxpbmcgYSBqb2IsIGV0Yy4gVGhpcyBhbGxvd3MgdGhlIG9yaWdpbmFsIG1vZGlmaWNhdGlvbiB0bwotICAgICAqIGNvbXBsZXRlIGZhc3RlciByZXN1bHRpbmcgaW4gYmV0dGVyIHBlcmNlaXZlZCByZXNwb25zaXZlbmVzcy48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQKLSAgICAgKi8KLSAgICAKLSAgICB2b2lkIGhhbmRsZUV2ZW50KCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGaXhlZEZhY2V0c0NoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lGaXhlZEZhY2V0c0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2FlZjI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGV2ZW50IG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBGSVhFRF9GQUNFVFNfQ0hBTkdFRCAKLSAqIGV2ZW50LiAKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQKLQotICAgIGV4dGVuZHMgSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgc2V0IG9mIGZhY2V0cyB0aGF0IHdlcmUgZml4ZWQgZm9yIHRoZSBwcm9qZWN0IHByaW9yIHRvIHRoZSBjaGFuZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIG9sZCBmaXhlZCBmYWNldHMKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVByb2plY3RGYWNldD4gZ2V0T2xkRml4ZWRGYWNldHMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgc2V0IG9mIGZhY2V0cyB0aGF0IGFyZSBmaXhlZCBmb3IgdGhlIHByb2plY3QgYWZ0ZXIgdGhlIGNoYW5nZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgbmV3IGZpeGVkIGZhY2V0cwotICAgICAqLwotICAgIAotICAgIFNldDxJUHJvamVjdEZhY2V0PiBnZXROZXdGaXhlZEZhY2V0cygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE5MWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgZXZlbnQgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIFBSSU1BUllfUlVOVElNRV9DSEFOR0VEIAotICogZXZlbnQuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudAotCi0gICAgZXh0ZW5kcyBJRmFjZXRlZFByb2plY3RFdmVudAotICAgIAotewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9sZCBwcmltYXJ5IHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9sZCBwcmltYXJ5IHJ1bnRpbWUgZm9yIHRoZSBwcm9qZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIAotICAgIElSdW50aW1lIGdldE9sZFByaW1hcnlSdW50aW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV3IHByaW1hcnkgcnVudGltZSBmb3IgdGhlIHByb2plY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IHByaW1hcnkgcnVudGltZSBmb3IgdGhlIHByb2plY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgCi0gICAgSVJ1bnRpbWUgZ2V0TmV3UHJpbWFyeVJ1bnRpbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lQcm9qZWN0RmFjZXRBY3Rpb25FdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL0lQcm9qZWN0RmFjZXRBY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDM1MjA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgZXZlbnQgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIFBSRV9JTlNUQUxMLCBQT1NUX0lOU1RBTEwsIAotICogUFJFX1VOSU5TVEFMTCwgUE9TVF9VTklOU1RBTEwsIFBSRV9WRVJTSU9OX0NIQU5HRSwgYW5kIFBPU1RfVkVSU0lPTl9DSEFOR0UgZXZlbnRzLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudAotCi0gICAgZXh0ZW5kcyBJRmFjZXRlZFByb2plY3RFdmVudAotICAgIAotewotICAgIC8qKgotICAgICAqIFRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBldmVudCBpcyBhYm91dC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBldmVudCBpcyBhYm91dC4KLSAgICAgKi8KLSAgICAKLSAgICBJUHJvamVjdEZhY2V0IGdldFByb2plY3RGYWNldCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBldmVudCBpcyBhYm91dC4gSW4gdGhlIGNhc2Ugb2YgdGhlCi0gICAgICogUFJFX1ZFUlNJT05fQ0hBTkdFIGFuZCBQT1NUX1ZFUlNJT05fQ0hBTkdFIGV2ZW50cywgdGhpcyB3aWxsIGJlIHRoZSBuZXcgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IHRoYXQgdGhpcyBldmVudCBpcyBhYm91dAotICAgICAqLwotICAgIAotICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY29uZmlnIG9iamVjdCB0aGF0IHdpbGwgYmUgKG9yIHdhcykgdXNlZCBmb3IgY29uZmlndXJpbmcgdGhlIGZhY2V0IGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25maWcgb2JqZWN0IG9mIHRoZSBmYWNldCBhY3Rpb24KLSAgICAgKi8KLSAgICAKLSAgICBPYmplY3QgZ2V0QWN0aW9uQ29uZmlnKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjVkNTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudAotCi0gICAgZXh0ZW5kcyBJRmFjZXRlZFByb2plY3RFdmVudAotICAgIAotewotICAgIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0QWRkZWRGYWNldHMoKTsKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFJlbW92ZWRGYWNldHMoKTsKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEZhY2V0c1dpdGhDaGFuZ2VkVmVyc2lvbnMoKTsKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEFsbEFmZmVjdGVkRmFjZXRzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ2YjFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9JVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgZXZlbnQgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIFRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQgCi0gKiBldmVudC4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQKLQotICAgIGV4dGVuZHMgSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgcnVudGltZXMgdGhhdCB0aGUgcHJvamVjdCBwcmV2aW91c2x5IHRhcmdldGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBydW50aW1lcyB0aGF0IHRoZSBwcm9qZWN0IHByZXZpb3VzbHkgdGFyZ2V0ZWQKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVJ1bnRpbWU+IGdldE9sZFRhcmdldGVkUnVudGltZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBydW50aW1lcyB0aGF0IHRoZSBwcm9qZWN0IG5vdyB0YXJnZXRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBydW50aW1lcyB0aGF0IHRoZSBwcm9qZWN0IG5vdyB0YXJnZXRzCi0gICAgICovCi0gICAgCi0gICAgU2V0PElSdW50aW1lPiBnZXROZXdUYXJnZXRlZFJ1bnRpbWVzKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRGVsYXllZENsYXNzTG9hZGluZ0xpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRGVsYXllZENsYXNzTG9hZGluZ0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDQ3ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0RlbGF5ZWRDbGFzc0xvYWRpbmdMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci0KLS8qKgotICogVGhpcyBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGRlbGF5IGNsYXNzIGxvYWRpbmcgb2YgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgdmlhIHRoZQotICogPGNvZGU+bGlzdGVuZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCB1bnRpbCB0aGUgbGlzdGVuZXIgaXMgYWN0dWFsbHkgaW52b2tlZC4gCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWxheWVkQ2xhc3NMb2FkaW5nTGlzdGVuZXIKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwbHVnaW5JZDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsaXN0ZW5lckNsYXNzTmFtZTsKLSAgICBwcml2YXRlIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyOwotICAgIAotICAgIHB1YmxpYyBEZWxheWVkQ2xhc3NMb2FkaW5nTGlzdGVuZXIoIGZpbmFsIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGlzdGVuZXJDbGFzc05hbWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotICAgICAgICB0aGlzLmxpc3RlbmVyQ2xhc3NOYW1lID0gbGlzdGVuZXJDbGFzc05hbWU7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMubGlzdGVuZXIgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnN0YW50aWF0ZSggdGhpcy5wbHVnaW5JZCwgdGhpcy5saXN0ZW5lckNsYXNzTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RMaXN0ZW5lci5jbGFzcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoIHRoaXMgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5saXN0ZW5lci5oYW5kbGVFdmVudCggZXZlbnQgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9FdmVudHNFeHRlbnNpb25Qb2ludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0V2ZW50c0V4dGVuc2lvblBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTM5MjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0V2ZW50c0V4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRFeHRlbnNpb25zOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZFJlcXVpcmVkQXR0cmlidXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZ2V0VG9wTGV2ZWxFbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5JbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgcHJvY2Vzc2luZyB0aGUgPGNvZGU+bGlzdGVuZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFdmVudHNFeHRlbnNpb25Qb2ludAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJsaXN0ZW5lcnMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0xJU1RFTkVSID0gImxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VWRU5UX1RZUEVTID0gImV2ZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NFeHRlbnNpb25zKCBmaW5hbCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwgZnJhbWV3b3JrICkKLSAgICB7Ci0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgCi0gICAgICAgICAgICAgOiBnZXRUb3BMZXZlbEVsZW1lbnRzKCBmaW5kRXh0ZW5zaW9ucyggUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyggRUxfTElTVEVORVIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZmluZFJlcXVpcmVkQXR0cmlidXRlKCBlbGVtZW50LCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBldmVudFR5cGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIEFUVFJfRVZFTlRfVFlQRVMgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZT4gdHlwZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBldmVudFR5cGVzICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIFN0cmluZyBzZWdtZW50IDogZXZlbnRUeXBlcy5zcGxpdCggIiwiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVwcGVyY2FzZWQgPSBzZWdtZW50LnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzLmFkZCggSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS52YWx1ZU9mKCB1cHBlcmNhc2VkICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMuaW52YWxpZEV2ZW50VHlwZSwgc2VnbWVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5JZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlW10gdHlwZXNBcnJheSAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbIHR5cGVzLnNpemUoKSBdOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdHlwZXMudG9BcnJheSggdHlwZXNBcnJheSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBEZWxheWVkQ2xhc3NMb2FkaW5nTGlzdGVuZXIoIHBsdWdpbklkLCBjbGFzc05hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZyYW1ld29yay5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzQXJyYXkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIgdmlhIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRXZlbnRUeXBlOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRXZlbnRzRXh0ZW5zaW9uUG9pbnQuY2xhc3MuZ2V0TmFtZSgpLCBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9FdmVudHNFeHRlbnNpb25Qb2ludC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0V2ZW50c0V4dGVuc2lvblBvaW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYmEzNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0V2ZW50c0V4dGVuc2lvblBvaW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbnZhbGlkRXZlbnRUeXBlID0gInswfSIgaXMgbm90IGEgdmFsaWQgZmFjZXRlZCBwcm9qZWN0IGV2ZW50IHR5cGUuIEl0IGlzIHVzZWQgaW4gezF9IHBsdWdpbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwMjZmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBGYWNldGVkUHJvamVjdEV2ZW50Ci0KLSAgICBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdEV2ZW50Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5OwotICAgIHByaXZhdGUgZmluYWwgVHlwZSBldmVudFR5cGU7Ci0gICAgCi0gICAgcHVibGljIEZhY2V0ZWRQcm9qZWN0RXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGV2ZW50VHlwZSApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gbnVsbDsKLSAgICAgICAgdGhpcy5ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIEZhY2V0ZWRQcm9qZWN0RXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGV2ZW50VHlwZSApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QgPSBudWxsOwotICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7Ci0gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGdldFByb2plY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldFdvcmtpbmdDb3B5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndvcmtpbmdDb3B5OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBUeXBlIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUeXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGJ1Zi5hcHBlbmQoICI8ZXZlbnQgcHJvamVjdD1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSApOwotICAgICAgICBidWYuYXBwZW5kKCAiXCIgdHlwZT1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCB0aGlzLmV2ZW50VHlwZS5uYW1lKCkgKTsKLSAgICAgICAgYnVmLmFwcGVuZCggIlwiPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0b1N0cmluZ0ludGVybmFsKCBidWYgKTsKLSAgICAgICAgCi0gICAgICAgIGJ1Zi5hcHBlbmQoICI8L2V2ZW50PiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0ludGVybmFsKCBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiApCi0gICAgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTZkODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50Ci0KLSAgICBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlIGV2ZW50VHlwZTsKLSAgICAKLSAgICBwdWJsaWMgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudCggZmluYWwgVHlwZSBldmVudFR5cGUgKQotICAgIHsKLSAgICAgICAgdGhpcy5ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBUeXBlIGdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUeXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGJ1Zi5hcHBlbmQoICI8ZXZlbnQgdHlwZT1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCB0aGlzLmV2ZW50VHlwZS5uYW1lKCkgKTsKLSAgICAgICAgYnVmLmFwcGVuZCggIlwiPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0b1N0cmluZ0ludGVybmFsKCBidWYgKTsKLSAgICAgICAgCi0gICAgICAgIGJ1Zi5hcHBlbmQoICI8L2V2ZW50PiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0ludGVybmFsKCBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiApCi0gICAgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3MTA3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGaXhlZEZhY2V0c0NoYW5nZWRFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RFdmVudAotICAgIGltcGxlbWVudHMgSUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gb2xkRml4ZWRGYWNldHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gbmV3Rml4ZWRGYWNldHM7Ci0gICAgCi0gICAgcHVibGljIEZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBvbGRGaXhlZEZhY2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBuZXdGaXhlZEZhY2V0cyApCi0gICAgewotICAgICAgICBzdXBlciggcHJvamVjdCwgVHlwZS5GSVhFRF9GQUNFVFNfQ0hBTkdFRCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5vbGRGaXhlZEZhY2V0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggb2xkRml4ZWRGYWNldHMgKTsKLSAgICAgICAgdGhpcy5uZXdGaXhlZEZhY2V0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggbmV3Rml4ZWRGYWNldHMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXQ+IGdldE9sZEZpeGVkRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9sZEZpeGVkRmFjZXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldD4gZ2V0TmV3Rml4ZWRGYWNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmV3Rml4ZWRGYWNldHM7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW50ZXJuYWwoIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmICkKLSAgICB7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDxvbGQtZml4ZWQtZmFjZXRzPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IHNvcnQoIHRoaXMub2xkRml4ZWRGYWNldHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICIgICAgPGZhY2V0IGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBidWYuYXBwZW5kKCBmLmdldElkKCkgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICJcIi8+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPC9vbGQtZml4ZWQtZmFjZXRzPlxuIiApOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPG5ldy1maXhlZC1mYWNldHM+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldCBmIDogc29ydCggdGhpcy5uZXdGaXhlZEZhY2V0cyApICkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCggIiAgICA8ZmFjZXQgaWQ9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGYuZ2V0SWQoKSApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggIlwiLz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCAiICA8L25ldy1maXhlZC1mYWNldHM+XG4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiBzb3J0KCBmaW5hbCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXQ+IGlucHV0ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiByZXN1bHQgPSBuZXcgVHJlZVNldDxJUHJvamVjdEZhY2V0PiggbmV3IEZhY2V0Q29tcGFyYXRvcigpICk7Ci0gICAgICAgIHJlc3VsdC5hZGRBbGwoIGlucHV0ICk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEZhY2V0Q29tcGFyYXRvciAKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBDb21wYXJhdG9yPElQcm9qZWN0RmFjZXQ+Ci0gICAgCi0gICAgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoIGZpbmFsIElQcm9qZWN0RmFjZXQgZjEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZjEuZ2V0SWQoKS5jb21wYXJlVG8oIGYyLmdldElkKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9GcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzhkYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0ZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeQotewotICAgIHByaXZhdGUgZmluYWwgTWFwPElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUsU2V0PElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyPj4gbGlzdGVuZXJzOwotICAgIAotICAgIHB1YmxpYyBGcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5KCkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzCi0gICAgICAgICAgICA9IG5ldyBFbnVtTWFwPElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUsU2V0PElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyPj4oIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUuY2xhc3MgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZSB0IDogSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQuVHlwZS52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1dCggdCwgbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXI+KCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgfHwgdHlwZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlIHR5cGUgCi0gICAgICAgICAgICAgOiAoIHR5cGVzLmxlbmd0aCA+IDAgPyB0eXBlcyA6IElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUudmFsdWVzKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmdldCggdHlwZSApLmFkZCggbGlzdGVuZXIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggU2V0PElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyPiBsaXN0ZW5lcnMgOiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudC5nZXRUeXBlKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KCBldmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlIGV2ZW50VHlwZSApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudFR5cGUgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9MZWdhY3lFdmVudEhhbmRsZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJhZDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9MZWdhY3lFdmVudEhhbmRsZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklSdW50aW1lQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcgotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVByb2plY3RGYWNldCBmYWNldDsKLSAgICBwcml2YXRlIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwcjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwbHVnaW5JZDsKLSAgICBwcml2YXRlIE9iamVjdCBkZWxlZ2F0ZTsKLSAgICAKLSAgICBwdWJsaWMgTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlciggZmluYWwgSVByb2plY3RGYWNldCBmYWNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVZlcnNpb25FeHByIHZleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVsZWdhdGVQbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlbGVnYXRlQ2xhc3NOYW1lICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDsKLSAgICAgICAgdGhpcy52ZXhwciA9IHZleHByOwotICAgICAgICB0aGlzLnBsdWdpbklkID0gZGVsZWdhdGVQbHVnaW5JZDsKLSAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlQ2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgaWYoIGV2ZW50IGluc3RhbmNlb2YgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGV2ID0gKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLmZhY2V0ID09IGV2LmdldFByb2plY3RGYWNldCgpICYmIAotICAgICAgICAgICAgICAgIHRoaXMudmV4cHIuY2hlY2soIGV2LmdldFByb2plY3RGYWNldFZlcnNpb24oKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBkZWxlZ2F0ZSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5leGVjdXRlKCBldi5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLCBldi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0QWN0aW9uQ29uZmlnKCksIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZXZlbnQgaW5zdGFuY2VvZiBJUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQgZXYgPSAoSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50KSBldmVudDsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0ID0gZXYuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoIHRoaXMuZmFjZXQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBwcm9qZWN0LmdldEluc3RhbGxlZFZlcnNpb24oIHRoaXMuZmFjZXQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdGhpcy52ZXhwci5jaGVjayggZnYgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW50aW1lQ2hhbmdlZEV2ZW50IGxlZ2FjeUV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBSdW50aW1lQ2hhbmdlZEV2ZW50KCBldi5nZXRPbGRQcmltYXJ5UnVudGltZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldE5ld1ByaW1hcnlSdW50aW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggZGVsZWdhdGUgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmV4ZWN1dGUoIGV2LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCksIGZ2LCBsZWdhY3lFdmVudCwgbnVsbCApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSURlbGVnYXRlIGdldERlbGVnYXRlKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5kZWxlZ2F0ZSBpbnN0YW5jZW9mIFN0cmluZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSAKLSAgICAgICAgICAgICAgICAgICAgPSBpbnN0YW50aWF0ZSggdGhpcy5wbHVnaW5JZCwgKFN0cmluZykgdGhpcy5kZWxlZ2F0ZSwgSURlbGVnYXRlLmNsYXNzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAoSURlbGVnYXRlKSB0aGlzLmRlbGVnYXRlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVDaGFuZ2VkRXZlbnQKLQotICAgICAgICBpbXBsZW1lbnRzIElSdW50aW1lQ2hhbmdlZEV2ZW50Ci0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJUnVudGltZSBvbGRSdW50aW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lIG5ld1J1bnRpbWU7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgUnVudGltZUNoYW5nZWRFdmVudCggZmluYWwgSVJ1bnRpbWUgb2xkUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIG5ld1J1bnRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm9sZFJ1bnRpbWUgPSBvbGRSdW50aW1lOwotICAgICAgICAgICAgdGhpcy5uZXdSdW50aW1lID0gbmV3UnVudGltZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIElSdW50aW1lIGdldE9sZFJ1bnRpbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5vbGRSdW50aW1lOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBJUnVudGltZSBnZXROZXdSdW50aW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3UnVudGltZTsKLSAgICAgICAgfQotICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0xlZ2FjeUxpc3RlbmVyQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL0xlZ2FjeUxpc3RlbmVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmRkNTY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9MZWdhY3lMaXN0ZW5lckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTGVnYWN5TGlzdGVuZXJBZGFwdGVyCi0KLSAgICBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciBiYXNlOwotICAgIAotICAgIHB1YmxpYyBMZWdhY3lMaXN0ZW5lckFkYXB0ZXIoIGZpbmFsIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyIGJhc2UgKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlID0gYmFzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZS5wcm9qZWN0Q2hhbmdlZCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZ2V0TGVnYWN5TGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9QcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1ByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTBlYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1ByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50Ci0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICBpbXBsZW1lbnRzIElQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWUgb2xkUHJpbWFyeVJ1bnRpbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJUnVudGltZSBuZXdQcmltYXJ5UnVudGltZTsKLSAgICAKLSAgICBwdWJsaWMgUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgb2xkUHJpbWFyeVJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZSBuZXdQcmltYXJ5UnVudGltZSApCi0gICAgewotICAgICAgICBzdXBlciggcHJvamVjdCwgVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5vbGRQcmltYXJ5UnVudGltZSA9IG9sZFByaW1hcnlSdW50aW1lOwotICAgICAgICB0aGlzLm5ld1ByaW1hcnlSdW50aW1lID0gbmV3UHJpbWFyeVJ1bnRpbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUnVudGltZSBnZXRPbGRQcmltYXJ5UnVudGltZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vbGRQcmltYXJ5UnVudGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJ1bnRpbWUgZ2V0TmV3UHJpbWFyeVJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmV3UHJpbWFyeVJ1bnRpbWU7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW50ZXJuYWwoIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmICkKLSAgICB7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDxvbGQtcHJpbWFyeS1ydW50aW1lIG5hbWU9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5vbGRQcmltYXJ5UnVudGltZSA9PSBudWxsID8gIjxudWxsPiIgOiB0aGlzLm9sZFByaW1hcnlSdW50aW1lLmdldE5hbWUoKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoICJcIi8+XG4iICk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBidWYuYXBwZW5kKCAiICA8bmV3LXByaW1hcnktcnVudGltZSBuYW1lPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMubmV3UHJpbWFyeVJ1bnRpbWUgPT0gbnVsbCA/ICI8bnVsbD4iIDogdGhpcy5uZXdQcmltYXJ5UnVudGltZS5nZXROYW1lKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCAiXCIvPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRBY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTA1MzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRBY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0RmFjZXRBY3Rpb25FdmVudAotCi0gICAgZXh0ZW5kcyBGYWNldGVkUHJvamVjdEV2ZW50Ci0gICAgaW1wbGVtZW50cyBJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGNvbmZpZzsKLSAgICAKLSAgICBwdWJsaWMgUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBldmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHByb2plY3QsIGV2ZW50VHlwZSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5mdiA9IGZ2OwotICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZ2LmdldFByb2plY3RGYWNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZ2OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWN0aW9uQ29uZmlnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZzsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbnRlcm5hbCggZmluYWwgU3RyaW5nQnVpbGRlciBidWYgKQotICAgIHsKLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPGZhY2V0IGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMuZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSApOwotICAgICAgICBidWYuYXBwZW5kKCAiXCIgdmVyc2lvbj1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBidWYuYXBwZW5kKCB0aGlzLmZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICBidWYuYXBwZW5kKCAiXCIvPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1N2RmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RFdmVudAotICAgIGltcGxlbWVudHMgSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYWRkZWRGYWNldHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHJlbW92ZWRGYWNldHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGNoYW5nZWRWZXJzaW9uczsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYWxsQWZmZWN0ZWRGYWNldHM7Ci0gICAgCi0gICAgcHVibGljIFByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGFkZGVkRmFjZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHJlbW92ZWRGYWNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gY2hhbmdlZFZlcnNpb25zICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBmcGp3YywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX0ZBQ0VUU19DSEFOR0VEICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmFkZGVkRmFjZXRzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCBhZGRlZEZhY2V0cyApOwotICAgICAgICB0aGlzLnJlbW92ZWRGYWNldHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHJlbW92ZWRGYWNldHMgKTsKLSAgICAgICAgdGhpcy5jaGFuZ2VkVmVyc2lvbnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIGNoYW5nZWRWZXJzaW9ucyApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhbGxBZmZlY3RlZEZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAKLSAgICAgICAgYWxsQWZmZWN0ZWRGYWNldHMuYWRkQWxsKCBhZGRlZEZhY2V0cyApOwotICAgICAgICBhbGxBZmZlY3RlZEZhY2V0cy5hZGRBbGwoIHJlbW92ZWRGYWNldHMgKTsKLSAgICAgICAgYWxsQWZmZWN0ZWRGYWNldHMuYWRkQWxsKCBjaGFuZ2VkVmVyc2lvbnMgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuYWxsQWZmZWN0ZWRGYWNldHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIGFsbEFmZmVjdGVkRmFjZXRzICk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0QWRkZWRGYWNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWRkZWRGYWNldHM7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UmVtb3ZlZEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVkRmFjZXRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEZhY2V0c1dpdGhDaGFuZ2VkVmVyc2lvbnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZFZlcnNpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldEFsbEFmZmVjdGVkRmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFsbEFmZmVjdGVkRmFjZXRzOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0TGlzdGVuZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDkwZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSxTZXQ8SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI+PiBsaXN0ZW5lcnM7Ci0gICAgCi0gICAgcHVibGljIFByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5KCkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzCi0gICAgICAgICAgICA9IG5ldyBFbnVtTWFwPElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUsU2V0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPj4oIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuY2xhc3MgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSB0IDogSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1dCggdCwgbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI+KCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgfHwgdHlwZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlIHR5cGUgCi0gICAgICAgICAgICAgOiAoIHR5cGVzLmxlbmd0aCA+IDAgPyB0eXBlcyA6IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUudmFsdWVzKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmdldCggdHlwZSApLmFkZCggbGlzdGVuZXIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggU2V0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPiBsaXN0ZW5lcnMgOiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudC5nZXRUeXBlKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KCBldmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJRmFjZXRlZFByb2plY3RMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlIGV2ZW50VHlwZSApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudFR5cGUgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9Qcm9qZWN0TW9kaWZpZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RNb2RpZmllZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDk3YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL2ludGVybmFsL1Byb2plY3RNb2RpZmllZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdE1vZGlmaWVkRXZlbnQKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RFdmVudAotICAgIAotewotICAgIHB1YmxpYyBQcm9qZWN0TW9kaWZpZWRFdmVudCggSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHByb2plY3QsIFR5cGUuUFJPSkVDVF9NT0RJRklFRCApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9UYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ldmVudHMvaW50ZXJuYWwvVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTFlNjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2V2ZW50cy9pbnRlcm5hbC9UYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50Ci0KLSAgICBleHRlbmRzIEZhY2V0ZWRQcm9qZWN0RXZlbnQKLSAgICBpbXBsZW1lbnRzIElUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVJ1bnRpbWU+IG9sZFRhcmdldGVkUnVudGltZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVJ1bnRpbWU+IG5ld1RhcmdldGVkUnVudGltZXM7Ci0gICAgCi0gICAgcHVibGljIFRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IG9sZFRhcmdldGVkUnVudGltZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gbmV3VGFyZ2V0ZWRSdW50aW1lcyApCi0gICAgewotICAgICAgICBzdXBlciggcHJvamVjdCwgVHlwZS5UQVJHRVRFRF9SVU5USU1FU19DSEFOR0VEICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm9sZFRhcmdldGVkUnVudGltZXMgPSBvbGRUYXJnZXRlZFJ1bnRpbWVzOwotICAgICAgICB0aGlzLm5ld1RhcmdldGVkUnVudGltZXMgPSBuZXdUYXJnZXRlZFJ1bnRpbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SVJ1bnRpbWU+IGdldE9sZFRhcmdldGVkUnVudGltZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub2xkVGFyZ2V0ZWRSdW50aW1lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElSdW50aW1lPiBnZXROZXdUYXJnZXRlZFJ1bnRpbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5ld1RhcmdldGVkUnVudGltZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdJbnRlcm5hbCggZmluYWwgU3RyaW5nQnVpbGRlciBidWYgKQotICAgIHsKLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPG9sZC10YXJnZXRlZC1ydW50aW1lcz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZSByIDogc29ydCggdGhpcy5vbGRUYXJnZXRlZFJ1bnRpbWVzICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAiICAgIDxydW50aW1lIG5hbWU9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHIuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAiXCIvPlxuIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJ1Zi5hcHBlbmQoICIgIDwvb2xkLXRhcmdldGVkLXJ1bnRpbWVzPlxuIiApOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYnVmLmFwcGVuZCggIiAgPG5ldy10YXJnZXRlZC1ydW50aW1lcz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZSByIDogc29ydCggdGhpcy5uZXdUYXJnZXRlZFJ1bnRpbWVzICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAiICAgIDxydW50aW1lIGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBidWYuYXBwZW5kKCByLmdldE5hbWUoKSApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggIlwiLz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCAiICA8L25ldy10YXJnZXRlZC1ydW50aW1lcz5cbiIgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPElSdW50aW1lPiBzb3J0KCBmaW5hbCBDb2xsZWN0aW9uPElSdW50aW1lPiBpbnB1dCApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHJlc3VsdCA9IG5ldyBUcmVlU2V0PElSdW50aW1lPiggbmV3IFJ1bnRpbWVDb21wYXJhdG9yKCkgKTsKLSAgICAgICAgcmVzdWx0LmFkZEFsbCggaW5wdXQgKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUnVudGltZUNvbXBhcmF0b3IgCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgQ29tcGFyYXRvcjxJUnVudGltZT4KLSAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZSggZmluYWwgSVJ1bnRpbWUgcjEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHIyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHIxLmdldE5hbWUoKS5jb21wYXJlVG8oIHIyLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQWN0aW9uRGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQWN0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzA1MjEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0FjdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5pbnN0YW50aWF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb25FeHByOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5JQWN0aW9uRGVmaW5pdGlvbjwvY29kZT4gaW50ZXJmYWNlLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWN0aW9uRGVmaW5pdGlvbgotCi0gICAgaW1wbGVtZW50cyBJQWN0aW9uRGVmaW5pdGlvbgotICAgIAotewotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotICAgIHByaXZhdGUgSVByb2plY3RGYWNldCBmYWNldDsKLSAgICBwcml2YXRlIElWZXJzaW9uRXhwciB2ZXJzaW9uTWF0Y2hFeHByOwotICAgIHByaXZhdGUgQWN0aW9uLlR5cGUgdHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBwcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IHByb3BlcnRpZXNSZWFkT25seTsKLSAgICBwcml2YXRlIFN0cmluZyBkZWxlZ2F0ZUNsYXNzTmFtZTsKLSAgICBwcml2YXRlIElEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLSAgICBwcml2YXRlIFN0cmluZyBjb25maWdGYWN0b3J5Q2xhc3NOYW1lOwotICAgIAotICAgIEFjdGlvbkRlZmluaXRpb24oKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4oKTsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoIHRoaXMucHJvcGVydGllcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldElkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFBsdWdpbklkKCBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXQ7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElWZXJzaW9uRXhwciBnZXRWZXJzaW9uRXhwcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uTWF0Y2hFeHByOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFZlcnNpb25FeHByKCBmaW5hbCBJVmVyc2lvbkV4cHIgZXhwciApCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb25NYXRjaEV4cHIgPSBleHByOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWN0aW9uLlR5cGUgZ2V0QWN0aW9uVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy50eXBlOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldEFjdGlvblR5cGUoIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgKQotICAgIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXNSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoIG5hbWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dCggbmFtZSwgdmFsdWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVDb25maWdPYmplY3QoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGpuYW1lICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQ29uZmlnT2JqZWN0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29uZmlnT2JqZWN0KCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggdGhpcy5jb25maWdGYWN0b3J5Q2xhc3NOYW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBmYWN0b3J5IAotICAgICAgICAgICAgICAgID0gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIHRoaXMuY29uZmlnRmFjdG9yeUNsYXNzTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkuY2xhc3MgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuICggKElBY3Rpb25Db25maWdGYWN0b3J5KSBmYWN0b3J5ICkuY3JlYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGdldERlbGVnYXRlQ2xhc3NOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlQ2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldERlbGVnYXRlQ2xhc3NOYW1lKCBmaW5hbCBTdHJpbmcgZGVsZWdhdGVDbGFzc05hbWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWxlZ2F0ZUNsYXNzTmFtZSA9IGRlbGVnYXRlQ2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICBJRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmRlbGVnYXRlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqIAotICAgICAgICAgICAgICAgID0gaW5zdGFudGlhdGUoIHRoaXMucGx1Z2luSWQsIHRoaXMuZGVsZWdhdGVDbGFzc05hbWUsIElEZWxlZ2F0ZS5jbGFzcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gKElEZWxlZ2F0ZSkgb2JqOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGdldENvbmZpZ0ZhY3RvcnlDbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnRmFjdG9yeUNsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRDb25maWdGYWN0b3J5Q2xhc3NOYW1lKCBmaW5hbCBTdHJpbmcgY29uZmlnRmFjdG9yeUNsYXNzTmFtZSApCi0gICAgewotICAgICAgICB0aGlzLmNvbmZpZ0ZhY3RvcnlDbGFzc05hbWUgPSBjb25maWdGYWN0b3J5Q2xhc3NOYW1lOwotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9DYXRlZ29yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmZmU0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9DYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2F0ZWdvcnkgCi0KLSAgICBpbXBsZW1lbnRzIElDYXRlZ29yeSAKLSAgICAKLXsKLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBwbHVnaW47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBTZXQ8SVByb2plY3RGYWNldD4gZmFjZXRzOwotICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXQ+IGZhY2V0c1JlYWRPbmx5OwotICAgIAotICAgIENhdGVnb3J5KCkgCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHRoaXMuZmFjZXRzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHRoaXMuZmFjZXRzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldElkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRQbHVnaW5JZCggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0TGFiZWwoIGZpbmFsIFN0cmluZyBsYWJlbCApCi0gICAgewotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0RGVzY3JpcHRpb24oIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiApCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldD4gZ2V0UHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWNldHNSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0cy5hZGQoIGYgKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCByZW1vdmVQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICB0aGlzLmZhY2V0cy5yZW1vdmUoIGYgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBDbGFzcyB0eXBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKCB0aGlzLCB0eXBlLmdldE5hbWUoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ29uc3RyYWludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE4YTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0NvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RyYWludAotCi0gICAgaW1wbGVtZW50cyBJQ29uc3RyYWludAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdD4gb3BlcmFuZHM7Ci0gICAgCi0gICAgQ29uc3RyYWludCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIG9wZXJhbmRzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZnYgPSBmdjsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiB0ZW1wID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG9wZXJhbmRzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcC5hZGQoIG9wZXJhbmRzWyBpIF0gKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5vcGVyYW5kcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIHRlbXAgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy50eXBlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldE9wZXJhbmRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9wZXJhbmRzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldE9wZXJhbmQoIGZpbmFsIGludCBpbmRleCApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5vcGVyYW5kcy5nZXQoIGluZGV4ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIGNoZWNrKCBmaW5hbCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrKCBmYWNldHMsIGZhbHNlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIGNoZWNrKCBmaW5hbCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVTb2Z0RGVwcyApCi0gICAgewotICAgICAgICBmaW5hbCBNdWx0aVN0YXR1cyByZXN1bHQgPSBjcmVhdGVNdWx0aVN0YXR1cygpOyAKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnR5cGUgPT0gVHlwZS5BTkQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIE9iamVjdCBvcGVyYW5kIDogdGhpcy5vcGVyYW5kcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgY2hpbGRDb25zdHJhaW50ID0gKElDb25zdHJhaW50KSBvcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QgPSBjaGlsZENvbnN0cmFpbnQuY2hlY2soIGZhY2V0cywgdmFsaWRhdGVTb2Z0RGVwcyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBzdC5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0sgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCggc3QgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdGhpcy50eXBlID09IFR5cGUuT1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHNvbWVCcmFuY2hXb3JrcyA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIE9iamVjdCBvcGVyYW5kIDogdGhpcy5vcGVyYW5kcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgY2hpbGRDb25zdHJhaW50ID0gKElDb25zdHJhaW50KSBvcGVyYW5kOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjaGlsZENvbnN0cmFpbnQuY2hlY2soIGZhY2V0cywgdmFsaWRhdGVTb2Z0RGVwcyApLmlzT0soKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzb21lQnJhbmNoV29ya3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIHNvbWVCcmFuY2hXb3JrcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb2JsZW0gcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHRoaXMub3BlcmFuZHMuc2l6ZSgpID09IDIgJiYgY29udGFpbnNPbmx5UmVxdWlyZXMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0RmFjZXRSZWZbXSBmcmVmcyA9IG5ldyBQcm9qZWN0RmFjZXRSZWZbIDIgXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgMjsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgYyA9IChJQ29uc3RyYWludCkgdGhpcy5vcGVyYW5kcy5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgcmYgPSAoSVByb2plY3RGYWNldCkgYy5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgPSAoSVZlcnNpb25FeHByKSBjLmdldE9wZXJhbmQoIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZnNbIGkgXSA9IG5ldyBQcm9qZWN0RmFjZXRSZWYoIHJmLCB2ZXhwciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwID0gbmV3IFZhbGlkYXRpb25Qcm9ibGVtKCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLlJFUVVJUkVTX09ORV9PRl9UV08sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnYsIGZyZWZzWyAwIF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVmc1sgMSBdICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBwID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcCA9IG5ldyBWYWxpZGF0aW9uUHJvYmxlbSggVmFsaWRhdGlvblByb2JsZW0uVHlwZS5DT01QTEVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ2ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIHAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0aGlzLnR5cGUgPT0gVHlwZS5SRVFVSVJFUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEJvb2xlYW4gc29mdAotICAgICAgICAgICAgICAgID0gKCAoQm9vbGVhbikgdGhpcy5vcGVyYW5kcy5nZXQoIHRoaXMub3BlcmFuZHMuc2l6ZSgpIC0gMSApICk7Ci0gICAgICAgIAotICAgICAgICAgICAgaWYoICEgc29mdC5lcXVhbHMoIEJvb2xlYW4uVFJVRSApIHx8IHZhbGlkYXRlU29mdERlcHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBmaXJzdE9wZXJhbmQgPSB0aGlzLm9wZXJhbmRzLmdldCggMCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJR3JvdXAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUdyb3VwIGdyb3VwID0gKElHcm91cCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgY29udGFpbnNBbnkoIGZhY2V0cywgZ3JvdXAuZ2V0TWVtYmVycygpICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLlJFUVVJUkVTX0dST1VQOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHB0eXBlLCB0aGlzLmZ2LCBncm91cCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBwcm9ibGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCByZiA9IChJUHJvamVjdEZhY2V0KSBmaXJzdE9wZXJhbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIHRoaXMub3BlcmFuZHMuZ2V0KCAxICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZmFjZXRzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZ2LmdldFByb2plY3RGYWNldCgpID09IHJmICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIuY2hlY2soIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgZm91bmQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHB0eXBlID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5SRVFVSVJFUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldFJlZiBmcmVmID0gbmV3IFByb2plY3RGYWNldFJlZiggcmYsIHZleHByICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25Qcm9ibGVtIHByb2JsZW0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHB0eXBlLCB0aGlzLmZ2LCBmcmVmICk7IAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBwcm9ibGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdGhpcy50eXBlID09IFR5cGUuQ09ORkxJQ1RTICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZpcnN0T3BlcmFuZCA9IHRoaXMub3BlcmFuZHMuZ2V0KCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJR3JvdXAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElHcm91cCBncm91cCA9IChJR3JvdXApIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gbWVtYmVyIDogZ3JvdXAuZ2V0TWVtYmVycygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBtZW1iZXIuZ2V0UHJvamVjdEZhY2V0KCkgIT0gdGhpcy5mdi5nZXRQcm9qZWN0RmFjZXQoKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cy5jb250YWlucyggbWVtYmVyICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLkNPTkZMSUNUUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHQsIHRoaXMuZnYsIG1lbWJlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBwcm9ibGVtICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gKElQcm9qZWN0RmFjZXQpIGZpcnN0T3BlcmFuZDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIKLSAgICAgICAgICAgICAgICAgICAgPSB0aGlzLm9wZXJhbmRzLnNpemUoKSA9PSAyID8gKElWZXJzaW9uRXhwcikgdGhpcy5vcGVyYW5kcy5nZXQoIDEgKSA6IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdmVyIDogZmFjZXRzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmdmVyLmdldFByb2plY3RGYWNldCgpID09IGYgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIgPT0gbnVsbCB8fCB2ZXhwci5jaGVjayggZnZlciApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlIHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5DT05GTElDVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFZhbGlkYXRpb25Qcm9ibGVtKCB0LCB0aGlzLmZ2LCBmdmVyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggcHJvYmxlbSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcnVuZXMgdGhlIGNvbnN0cmFpbnQgYnkgcmVtb3ZpbmcgcGFydHMgdGhhdCBhcmUgbm90IHJlbGV2YW50IG9yIHNhdGlzZmllZCBieSBkZWZhdWx0Ci0gICAgICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb3ZpZGVkIGZpeGVkIGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiA8b2w+Ci0gICAgICogICA8bGk+QW4gQU5EIG9yIGFuIE9SIG9wZXJhdG9yIHdpdGggbm8gY2hpbGRyZW4gaXMgZWxpbWluYXRlZC48L2xpPgotICAgICAqICAgPGxpPkFuIEFORCBvciBhbiBPUiBvcGVyYXRvciB3aXRoIG9uZSBjaGlsZCBpcyByZXBsYWNlZCBieSB0aGF0IGNoaWxkLjwvbGk+Ci0gICAgICogICA8bGk+QSBSRVFVSVJFU19GQUNFVCBvcGVyYXRvciBpcyBlbGltaW5hdGVkIGlmIGFsbCBhcHBsaWNhYmxlIHZlcnNpb25zIG9mCi0gICAgICogICAgIHRoYXQgZmFjZXQgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZSBmaXhlZCBmYWNldHMuPC9saT4KLSAgICAgKiAgIDxsaT5BIFJFUVVJUkVEX0ZBQ0VUIG9wZXJhdG9yIGlzIGVsaW1pbmF0ZWQgaWYgaXQgd2lsbCBhY2NlcHQgZXZlcnkgdmVyc2lvbgotICAgICAqICAgICBvZiBhIGZpeGVkIGZhY2V0LjwvbGk+Ci0gICAgICogICA8bGk+QSBDT05GTElDVFNfV0lUSF9GQUNFVCBvcGVyYXRvciBpcyBlbGltaW5hdGVkIGlmIG5vbmUgb2YgdGhlIG1hdGNoZWQgdmVyc2lvbnMKLSAgICAgKiAgICAgb2YgdGhhdCBmYWNldCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBmaXhlZCBmYWNldHMuPC9saT4KLSAgICAgKiAgIDxsaT5BIENPTkZMSUNUU19XSVRIX0dST1VQIG9wZXJhdG9yIGlzIGVsaW1pbmF0ZWQgaWYgYWxsIG1lbWJlcnMgb2YgdGhlIGdyb3VwCi0gICAgICogICAgIChub3QgY291bnRpbmcgdGhpcyBmYWNldCkgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZSBmaXhlZCBmYWNldHMuPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUNvbnN0cmFpbnQgcHJ1bmVDb25zdHJhaW50KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXQ+IGZpeGVkRmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcnVuZUNvbnN0cmFpbnQoIGZhY2V0LCBmYWNldC5nZXRDb25zdHJhaW50KCksIGZpeGVkRmFjZXRzICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUNvbnN0cmFpbnQgcHJ1bmVDb25zdHJhaW50KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50IGNvbnN0cmFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWRGYWNldHMgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSB0eXBlID0gY29uc3RyYWludC5nZXRUeXBlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLkFORCB8fCB0eXBlID09IElDb25zdHJhaW50LlR5cGUuT1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PElDb25zdHJhaW50PiBuZXdPcGVyYW5kcyA9IG5ldyBBcnJheUxpc3Q8SUNvbnN0cmFpbnQ+KCk7Ci0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBPYmplY3Qgb3BlcmFuZCA6IGNvbnN0cmFpbnQuZ2V0T3BlcmFuZHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgbmV3T3BlcmFuZCAKLSAgICAgICAgICAgICAgICAgICAgPSBwcnVuZUNvbnN0cmFpbnQoIGZhY2V0LCAoSUNvbnN0cmFpbnQpIG9wZXJhbmQsIGZpeGVkRmFjZXRzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG5ld09wZXJhbmQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggb3BlcmFuZCAhPSBuZXdPcGVyYW5kICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBuZXdPcGVyYW5kcy5hZGQoIG5ld09wZXJhbmQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3T3BlcmFuZHMuYWRkKCAoSUNvbnN0cmFpbnQpIG9wZXJhbmQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBuZXdPcGVyYW5kQ291bnQgPSBuZXdPcGVyYW5kcy5zaXplKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBuZXdPcGVyYW5kQ291bnQgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBuZXdPcGVyYW5kQ291bnQgPT0gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld09wZXJhbmRzLmdldCggMCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hhbmdlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJhaW50KCAoIChDb25zdHJhaW50KSBjb25zdHJhaW50ICkuZnYsIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcGVyYW5kcy50b0FycmF5KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0eXBlID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZmlyc3RPcGVyYW5kID0gY29uc3RyYWludC5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSAoSVByb2plY3RGYWNldCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIGNvbnN0cmFpbnQuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBhY2NlcHRhYmxlVmVyc2lvbkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB2ZXhwci5jaGVjayggZnYgKSAmJiBmdi5pc1ZhbGlkRm9yKCBmaXhlZEZhY2V0cyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0YWJsZVZlcnNpb25Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBhY2NlcHRhYmxlVmVyc2lvbkNvdW50ID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBmaXhlZEZhY2V0cy5jb250YWlucyggZiApICYmIAotICAgICAgICAgICAgICAgICAgICBmLmdldFZlcnNpb25zKCkuc2l6ZSgpID09IGFjY2VwdGFibGVWZXJzaW9uQ291bnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZmlyc3RPcGVyYW5kID0gY29uc3RyYWludC5nZXRPcGVyYW5kKCAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSAoSVByb2plY3RGYWNldCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIGNvbnN0cmFpbnQuZ2V0T3BlcmFuZCggMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNWYWxpZEZvckNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB2ZXhwci5jaGVjayggZnYgKSAmJiBmdi5pc1ZhbGlkRm9yKCBmaXhlZEZhY2V0cyApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZEZvckNvbnRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgaXNWYWxpZEZvckNvbnRleHQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlyc3RPcGVyYW5kIGluc3RhbmNlb2YgSUdyb3VwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJR3JvdXAgZ3JvdXAgPSAoSUdyb3VwKSBmaXJzdE9wZXJhbmQ7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBhdExlYXN0T25lSXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gbWVtYmVyIDogZ3JvdXAuZ2V0TWVtYmVycygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBtZW1iZXIuZ2V0UHJvamVjdEZhY2V0KCkgIT0gZmFjZXQuZ2V0UHJvamVjdEZhY2V0KCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuaXNWYWxpZEZvciggZml4ZWRGYWNldHMgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVJc1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGF0TGVhc3RPbmVJc1ZhbGlkICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc09ubHlSZXF1aXJlcygpCi0gICAgewotICAgICAgICBmb3IoIE9iamVjdCBvcGVyYW5kIDogdGhpcy5vcGVyYW5kcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIChJQ29uc3RyYWludCkgb3BlcmFuZCApLmdldFR5cGUoKSAhPSBUeXBlLlJFUVVJUkVTICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQW55KCBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBPYmplY3Q+IGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgT2JqZWN0PiBiICkKLSAgICB7Ci0gICAgICAgIGZvciggT2JqZWN0IHggOiBhICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGIuY29udGFpbnMoIHggKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIE11bHRpU3RhdHVzIGNyZWF0ZU11bHRpU3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyggbmV3IElTdGF0dXNbIDAgXSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTXVsdGlTdGF0dXMgY3JlYXRlTXVsdGlTdGF0dXMoIGZpbmFsIElTdGF0dXNbXSBjaGlsZHJlbiApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE11bHRpU3RhdHVzKCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBjaGlsZHJlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy52YWxpZGF0aW9uUHJvYmxlbXMsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBidWYuYXBwZW5kKCB0aGlzLnR5cGUubmFtZSgpICk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoICIoICIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIGZvciggT2JqZWN0IG9wZXJhbmQgOiB0aGlzLm9wZXJhbmRzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGlzRmlyc3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAiLCAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnVmLmFwcGVuZCggb3BlcmFuZC50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJ1Zi5hcHBlbmQoICIgKSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRpb25Qcm9ibGVtczsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIENvbnN0cmFpbnQuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Db25zdHJhaW50LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Db25zdHJhaW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMmYzM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvQ29uc3RyYWludC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdmFsaWRhdGlvblByb2JsZW1zID0gT25lIG9yIG1vcmUgY29uc3RyYWludHMgaGF2ZSBub3QgYmVlbiBzYXRpc2ZpZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9EZWZhdWx0RmFjZXRzRXh0ZW5zaW9uUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4ZjdkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9EZWZhdWx0RmFjZXRzRXh0ZW5zaW9uUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kRXh0ZW5zaW9uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldFRvcExldmVsRWxlbWVudHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5yZXBvcnRNaXNzaW5nQXR0cmlidXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLkludmFsaWRFeHRlbnNpb25FeGNlcHRpb247Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBwcm9jZXNzaW5nIHRoZSA8Y29kZT5kZWZhdWx0RmFjZXRzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuIAotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdEZhY2V0c0V4dGVuc2lvblBvaW50Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImRlZmF1bHRGYWNldHMiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9DT05URVhUID0gImNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0RFRkFVTFRfRkFDRVRTID0gImRlZmF1bHQtZmFjZXRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRklYRURfRkFDRVQgPSAiZml4ZWQtZmFjZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1JVTlRJTUVfQ09NUE9ORU5UID0gInJ1bnRpbWUtY29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxEZWZhdWx0RmFjZXRzRXh0ZW5zaW9uPiBleHRlbnNpb25zID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0RGVmYXVsdEZhY2V0cyggZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmVhZEV4dGVuc2lvbnMoKTsKLQotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgPSBmcHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgIAotICAgICAgICAvLyAxLiBHZXQgdGhlIGNvbXBsZXRlIGxpc3QuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBNYXA8SVByb2plY3RGYWNldCxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzIAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJUHJvamVjdEZhY2V0LElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBEZWZhdWx0RmFjZXRzRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZXh0ZW5zaW9uLm1hdGNoKCBmcHJvaiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZXh0ZW5zaW9uLmdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWNldHMucHV0KCBmdi5nZXRQcm9qZWN0RmFjZXQoKSwgZnYgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIDIuIFJlbW92ZSB0aGUgZmFjZXRzIHRoYXQgY29uZmxpY3Qgd2l0aCBmaXhlZCBmYWNldHMuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gdG9SZW1vdmUgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGZhY2V0cy52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIGZ2LmlzVmFsaWRGb3IoIGZpeGVkICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFkZCggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiB0b1JlbW92ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0cy5yZW1vdmUoIGYgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gMy4gTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdCBpbmNsdWRlcyBhbGwgb2YgdGhlIGZpeGVkIGZhY2V0cy4KLSAgICAgICAgCi0gICAgICAgIE1hcDxJUHJvamVjdEZhY2V0LElQcm9qZWN0RmFjZXRWZXJzaW9uPiB0b2FkZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IGZpeGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgZmFjZXRzLmNvbnRhaW5zS2V5KCBmICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB0b2FkZCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRvYWRkID0gbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldCxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnY7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmdiA9IGYuZ2V0TGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiggcnVudGltZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmdiA9IGYuZ2V0RGVmYXVsdFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdG9hZGQucHV0KCBmLCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggdG9hZGQgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0cy5wdXRBbGwoIHRvYWRkICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIDQuIFJldHVybiB0aGUgcmVzdWx0LgotICAgICAgICAKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCBmYWNldHMudmFsdWVzKCkgKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWFkRXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICBpZiggZXh0ZW5zaW9ucyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDxEZWZhdWx0RmFjZXRzRXh0ZW5zaW9uPigpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IAotICAgICAgICAgICAgIDogZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluZEV4dGVuc2lvbnMoIFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoIEVMX0RFRkFVTFRfRkFDRVRTICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZEV4dGVuc2lvbiggZWxlbWVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGUgdXNlciB2aWEgdGhlIGxvZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRFeHRlbnNpb24oIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIAotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgRGVmYXVsdEZhY2V0c0V4dGVuc2lvbiBleHRlbnNpb24gPSBuZXcgRGVmYXVsdEZhY2V0c0V4dGVuc2lvbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgOiBjb25maWcuZ2V0Q2hpbGRyZW4oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9SVU5USU1FX0NPTVBPTkVOVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSdW50aW1lQ29tcG9uZW50VHlwZVJlZiByY3RSZWYgPSBSdW50aW1lQ29tcG9uZW50VHlwZVJlZi5yZWFkKCBjaGlsZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCByY3RSZWYgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBleHRlbnNpb24uYWRkQ29udGV4dCggcmN0UmVmICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9DT05URVhUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbnRleHRDaGlsZCA6IGNoaWxkLmdldENoaWxkcmVuKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRleHRDaGlsZE5hbWUgPSBjb250ZXh0Q2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvbnRleHRDaGlsZE5hbWUuZXF1YWxzKCBFTF9SVU5USU1FX0NPTVBPTkVOVCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVudGltZUNvbXBvbmVudFR5cGVSZWYgcmN0UmVmID0gUnVudGltZUNvbXBvbmVudFR5cGVSZWYucmVhZCggY29udGV4dENoaWxkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByY3RSZWYgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmFkZENvbnRleHQoIHJjdFJlZiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNvbnRleHRDaGlsZE5hbWUuZXF1YWxzKCBFTF9GSVhFRF9GQUNFVCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGNvbnRleHRDaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBmaWQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLnJlcG9ydE1pc3NpbmdGYWNldCggZmlkLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggZmlkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5hZGRDb250ZXh0KCBmICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9GQUNFVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlkID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBmaWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9JRCApOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggZmlkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlciA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHZlciA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgZi5oYXNWZXJzaW9uKCB2ZXIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuUmVzb3VyY2VzLmZhY2V0VmVyc2lvbk5vdERlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldElkKCksIHZlciApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbXNnICs9IE5MUy5iaW5kKCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuUmVzb3VyY2VzLnVzZWRJblBsdWdpbiwgcGx1Z2luSWQgKTsgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5hZGRQcm9qZWN0RmFjZXQoIGYuZ2V0VmVyc2lvbiggdmVyICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXh0ZW5zaW9ucy5hZGQoIGV4dGVuc2lvbiApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERlZmF1bHRGYWNldHNFeHRlbnNpb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXQ+IGNvbnRleHRGaXhlZEZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFNldDxSdW50aW1lQ29tcG9uZW50VHlwZVJlZj4gY29udGV4dFJ1bnRpbWVDb21wb25lbnRUeXBlcyAKLSAgICAgICAgICAgID0gbmV3IEhhc2hTZXQ8UnVudGltZUNvbXBvbmVudFR5cGVSZWY+KCk7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb250ZXh0KCBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb250ZXh0Rml4ZWRGYWNldHMuYWRkKCBmYWNldCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb250ZXh0KCBmaW5hbCBSdW50aW1lQ29tcG9uZW50VHlwZVJlZiBydW50aW1lQ29tcG9uZW50VHlwZVJlZiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29udGV4dFJ1bnRpbWVDb21wb25lbnRUeXBlcy5hZGQoIHJ1bnRpbWVDb21wb25lbnRUeXBlUmVmICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY2V0cy5hZGQoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKCBmaW5hbCBJRmFjZXRlZFByb2plY3RCYXNlIGZwcm9qICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgdGhpcy5jb250ZXh0Rml4ZWRGYWNldHMuaXNFbXB0eSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWRGYWNldHMgPSBmcHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBmaXhlZEZhY2V0cy5jb250YWluc0FsbCggdGhpcy5jb250ZXh0Rml4ZWRGYWNldHMgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISB0aGlzLmNvbnRleHRSdW50aW1lQ29tcG9uZW50VHlwZXMuaXNFbXB0eSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZSBydW50aW1lID0gZnByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBSdW50aW1lQ29tcG9uZW50VHlwZVJlZiByY3RSZWYgOiB0aGlzLmNvbnRleHRSdW50aW1lQ29tcG9uZW50VHlwZXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudCByYyA6IHJ1bnRpbWUuZ2V0UnVudGltZUNvbXBvbmVudHMoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByY3RSZWYuY2hlY2soIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggcmMuZ2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oKSApICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgZm91bmQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRDb3JlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMDI5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldENvcmVQbHVnaW4gCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuUExVR0lOX0lEOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDSU5HX0FDVElPTl9TT1JUSU5HCi0gICAgICAgID0gUExVR0lOX0lEICsgIi9hY3Rpb25Tb3J0aW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNJTkdfRlJBTUVXT1JLX0FDVElWQVRJT04KLSAgICAgICAgPSBQTFVHSU5fSUQgKyAiL2FjdGl2YXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gbWVzc2FnZXNMb2dnZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvZyBwbGF0Zm9ybUxvZwotICAgICAgICA9IFBsYXRmb3JtLmdldExvZyggUGxhdGZvcm0uZ2V0QnVuZGxlKCBQTFVHSU5fSUQgKSApOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmdBY3Rpb25Tb3J0aW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjaGVja0RlYnVnT3B0aW9uKCBUUkFDSU5HX0FDVElPTl9TT1JUSU5HICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmdGcmFtZXdvcmtBY3RpdmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjaGVja0RlYnVnT3B0aW9uKCBUUkFDSU5HX0ZSQU1FV09SS19BQ1RJVkFUSU9OICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tEZWJ1Z09wdGlvbiggZmluYWwgU3RyaW5nIGRlYnVnT3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBvcHRpb25WYWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCBkZWJ1Z09wdGlvbiApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9wdGlvblZhbHVlID09IG51bGwgCi0gICAgICAgICAgICAgICA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKCBvcHRpb25WYWx1ZSApLmVxdWFscyggQm9vbGVhbi5UUlVFICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSArICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIElTdGF0dXMgc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIHBsYXRmb3JtTG9nLmxvZyggc3RhdHVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIFN0cmluZyBtc2cgKQotICAgIHsKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvciggZmluYWwgU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICBsb2dFcnJvciggbXNnLCBmYWxzZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoIGZpbmFsIFN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1cHByZXNzRHVwbGljYXRlcyApCi0gICAgewotICAgICAgICBpZiggc3VwcHJlc3NEdXBsaWNhdGVzICYmIG1lc3NhZ2VzTG9nZ2VkLmNvbnRhaW5zKCBtc2cgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbWVzc2FnZXNMb2dnZWQuYWRkKCBtc2cgKTsKLSAgICAgICAgCi0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKCBmaW5hbCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIGxvZ1dhcm5pbmcoIG1zZywgZmFsc2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoIGZpbmFsIFN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NEdXBsaWNhdGVzICkKLSAgICB7Ci0gICAgICAgIGlmKCBzdXBwcmVzc0R1cGxpY2F0ZXMgJiYgbWVzc2FnZXNMb2dnZWQuY29udGFpbnMoIG1zZyApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtZXNzYWdlc0xvZ2dlZC5hZGQoIG1zZyApOwotICAgICAgICAKLSAgICAgICAgbG9nKCBuZXcgU3RhdHVzKCBJU3RhdHVzLldBUk5JTkcsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKCBmaW5hbCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFcnJvclN0YXR1cyggbXNnLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKCBmaW5hbCBTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uIGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIG1zZywgZSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODllY2M1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5GaWxlVXRpbC52YWxpZGF0ZUVkaXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUHJvZ3Jlc3NNb25pdG9yVXRpbC5iZWdpblRhc2s7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUHJvZ3Jlc3NNb25pdG9yVXRpbC5kb25lOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlByb2dyZXNzTW9uaXRvclV0aWwuc3VibW9uOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlByb2dyZXNzTW9uaXRvclV0aWwud29ya2VkOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlhtbFV0aWwuZXNjYXBlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVRhcmdldGVkUnVudGltZXNDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsLkZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5MZWdhY3lMaXN0ZW5lckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsLlByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5Qcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuUHJvamVjdExpc3RlbmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsLlByb2plY3RNb2RpZmllZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5UYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmludGVybmFsLlVua25vd25SdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuT2JqZWN0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotLyogCi0gKiBTeW5jaHJvbml6YXRpb24gTm90ZXMKLSAqIAotICogMS4gVGhlcmUgaXMgYW4gaW50ZXJuYWwgbG9jayBvYmplY3QgdGhhdCdzIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvCi0gKiAgICB0aGUgZGF0YSBzdHJ1Y3R1cmUuIEJ5IHN5bmNocm9uaXppbmcgb24gYW4gaW50ZXJuYWwgb2JqZWN0LCBvdXRzaWRlIGNvZGUKLSAqICAgIGNhbm5vdCBjYXVzZSBhIGRlYWRsb2NrIGJ5IHN5bmNocm9uaXppbmcgb24gdGhlIEZhY2V0ZWRQcm9qZWN0IG9iamVjdC4KLSAqICAgIAotICogMi4gUmVhZGVycyBzeW5jaHJvbml6ZSBvbiB0aGUgbG9jayBvYmplY3QgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbWV0aG9kCi0gKiAgICBjYWxsLiBUaGlzIHByb3RlY3RzIHRoZSByZWFkZXJzIGZyb20gd3JpdGVycyBhbmQgbWFrZXMgc3VyZSB0aGF0IHJlYWRlcgotICogICAgaXMgbm90IHJlYWRpbmcgc3RhbGUgZGF0YSBmcm9tIHRocmVhZCdzIGxvY2FsIG1lbW9yeS4KLSAqICAgIAotICogMy4gQWxsIGNvbGxlY3Rpb25zIHRoYXQgYXJlIHJldHVybmVkIGJ5IHRoZSByZWFkZXIgbWV0aG9kcyBhcmUgZ3VhcmFudGVlZAotICogICAgdG8gbm90IGNoYW5nZSBhZnRlciB0aGUgZmFjdC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB0aHJvdWdoIGEgY29weS1vbi13cml0ZSAKLSAqICAgIHBvbGljeS4KLSAqIAotICogNC4gV3JpdGVycyBzeW5jaHJvbml6ZSBvbiB0aGUgbG9jayBvYmplY3QgYnJpZWZseSBhdCB0aGUgc3RhcnQgb2YgdGhlIG1ldGhvZCAKLSAqICAgIGFuZCBtYXJrIHRoZSBGYWNldGVkUHJvamVjdCBhcyBiZWluZyBtb2RpZmllZC4gSWYgdGhlIHByb2plY3QgaXMgYWxyZWFkeQotICogICAgYmVpbmcgbW9kaWZpZWQsIHRoZSBuZXcgd3JpdGVyIHdpbGwgd2FpdC4gSW5zaWRlIHRoZSBib2RpZXMgb2YgdGhlCi0gKiAgICBtb2RpZmllciBtZXRob2RzLCB0aGUgd3JpdGVyIHRocmVhZCBpcyBvbmx5IHN5bmNocm9uaXplZCBvbiB0aGUgbG9jawotICogICAgb2JqZWN0IHdoaWxlIG1vZGlmeWluZyB0aGUgaW50ZXJuYWwgZGF0YXN0cnVjdHVyZXMuIFRoZXNlIHN5bmNocm9uaXphdGlvbgotICogICAgc2VjdGlvbnMgYXJlIGtlcHQgc2hvcnQgYW5kIHRoZXkgbmV2ZXIgc3BhbiBvdmVyIGNvZGUgdGhhdCBtaWdodCBtb2RpZnkKLSAqICAgIGZpbGUgc3lzdGVtIHJlc291cmNlcy4gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgZGVhZGxvY2tzLiBPbmNlIHRoZSB3cml0ZQotICogICAgaXMgY29tcGxldGUsIHRoZSB3cml0ZXIgdGhyZWFkIHN5bmNocm9uaXplcyBvbiB0aGUgbG9jayBvYmplY3QsIHJlc2V0cyB0aGUgCi0gKiAgICAiYmVpbmcgbW9kaWZpZWQiIGZsYWcsIGFuZCBub3RpZmllcyBhbnkgd3JpdGVycyB0aGF0IG1heSBiZSB3YWl0aW5nLiAKLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRlZFByb2plY3QKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0Ci0gICAgCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfRklMRQotICAgICAgICA9ICIuc2V0dGluZ3MvIiArIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnhtbCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNJTkdfREVMRUdBVEVfQ0FMTFMKLSAgICAgICAgPSBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi9kZWxlZ2F0ZS9jYWxscyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUlVOVElNRSA9ICJydW50aW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9TRUNPTkRBUllfUlVOVElNRSA9ICJzZWNvbmRhcnktcnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRklYRUQgPSAiZml4ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0lOU1RBTExFRCA9ICJpbnN0YWxsZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBQ0VUID0gImZhY2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHNSZWFkT25seTsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBmaXhlZDsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBmaXhlZFJlYWRPbmx5OwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxQcm9qZWN0RmFjZXQ+IHVua25vd25GYWNldHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiB0YXJnZXRlZFJ1bnRpbWVzOwotICAgIHByaXZhdGUgU3RyaW5nIHByaW1hcnlSdW50aW1lOwotICAgIElGaWxlIGY7Ci0gICAgcHJpdmF0ZSBsb25nIGZNb2RpZmljYXRpb25TdGFtcCA9IC0xOwotICAgIHByaXZhdGUgZmluYWwgUHJvamVjdExpc3RlbmVyUmVnaXN0cnkgbGlzdGVuZXJzOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmVpbmdNb2RpZmllZCA9IGZhbHNlOwotICAgIHByaXZhdGUgVGhyZWFkIG1vZGlmaWVyVGhyZWFkID0gbnVsbDsKLSAgICBwcml2YXRlIEV4Y2VwdGlvbiBwYXJzaW5nRXhjZXB0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlbGV0ZWQ7Ci0gICAgCi0gICAgRmFjZXRlZFByb2plY3QoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIHRoaXMuZmFjZXRzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIHRoaXMuZmFjZXRzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHRoaXMuZmFjZXRzICk7Ci0gICAgICAgIHRoaXMuZml4ZWQgPSBuZXcgQ29weU9uV3JpdGVBcnJheVNldDxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICB0aGlzLmZpeGVkUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHRoaXMuZml4ZWQgKTsKLSAgICAgICAgdGhpcy51bmtub3duRmFjZXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFByb2plY3RGYWNldD4oKTsKLSAgICAgICAgdGhpcy50YXJnZXRlZFJ1bnRpbWVzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8U3RyaW5nPigpOwotICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBQcm9qZWN0TGlzdGVuZXJSZWdpc3RyeSgpOwotICAgICAgICB0aGlzLnBhcnNpbmdFeGNlcHRpb24gPSBudWxsOwotICAgICAgICB0aGlzLmlzRGVsZXRlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdGhpcy5mID0gcHJvamVjdC5nZXRGaWxlKCBNRVRBREFUQV9GSUxFICk7Ci0gICAgICAgIAotICAgICAgICByZWZyZXNoKCB0cnVlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHNSZWFkT25seTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiB0aGlzLmZhY2V0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZ2LmdldFByb2plY3RGYWNldCgpID09IGYgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5jb250YWlucyggZnYgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbiggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuZmFjZXRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZnYuZ2V0UHJvamVjdEZhY2V0KCkgPT0gZiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRJbnN0YWxsZWRWZXJzaW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb2plY3RGYWNldFZlcnNpb24oIGYgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnN0YWxsUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbiAKLSAgICAgICAgICAgID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZnYsIGNvbmZpZyApOwotICAgICAgICAgICAgCi0gICAgICAgIG1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbW9uaXRvciApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuaW5zdGFsbFByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uIAotICAgICAgICAgICAgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5VTklOU1RBTEwsIGZ2LCBjb25maWcgKTsKLSAgICAgICAgICAgIAotICAgICAgICBtb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG1vbml0b3IgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5KCBmaW5hbCBTZXQ8QWN0aW9uPiBhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4gcmVzdWx0ID0gbmV3IE9iamVjdFJlZmVyZW5jZTxCb29sZWFuPiggdHJ1ZSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIHdyID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlZ2luTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IGNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIEFjdGlvbiBhY3Rpb24gOiBhY3Rpb25zICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aW9uLlR5cGUgdHlwZSA9IGFjdGlvbi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLklOU1RBTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwandjLmFkZFByb2plY3RGYWNldCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwandjLmNoYW5nZVByb2plY3RGYWNldFZlcnNpb24oIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBqd2MucmVtb3ZlUHJvamVjdEZhY2V0KCBmdiApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZyA9IGFjdGlvbi5nZXRDb25maWcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbmZpZyAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGp3Yy5zZXRQcm9qZWN0RmFjZXRBY3Rpb25Db25maWcoIGZ2LmdldFByb2plY3RGYWNldCgpLCBjb25maWcgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldCggbWVyZ2VDaGFuZ2VzSW50ZXJuYWwoIGZwandjLCBtb25pdG9yICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgd3MucnVuKCB3ciwgd3MuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvciApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJlc3VsdC5nZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IFByb2plY3RNb2RpZmllZEV2ZW50KCB0aGlzICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1vZGlmeUludGVybmFsKCBmaW5hbCBTZXQ8QWN0aW9uPiBhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBiZWdpblRhc2soIG1vbml0b3IsICIiLCBhY3Rpb25zLnNpemUoKSAqIDEwMCApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVOb3REZWxldGVkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jaGVjayggdGhpcy5mYWNldHMsIGFjdGlvbnMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICEgc3QuaXNPSygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU29ydCB0aGUgYWN0aW9ucyBpbnRvIHRoZSBvcmRlciBvZiBleGVjdXRpb24uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QWN0aW9uPiBjb3B5ID0gbmV3IEFycmF5TGlzdDxBY3Rpb24+KCBhY3Rpb25zICk7Ci0gICAgICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5zb3J0KCB0aGlzLmZhY2V0cywgY29weSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBhY3Rpb25zLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEFjdGlvbiBhY3Rpb24gOiBjb3B5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlID0gYWN0aW9uLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gKFByb2plY3RGYWNldFZlcnNpb24pIGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUFjdGlvbkRlZmluaXRpb24gZGVmID0gZnYuZ2V0QWN0aW9uRGVmaW5pdGlvbiggdGhpcy5mYWNldHMsIHR5cGUgKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnID0gYWN0aW9uLmdldENvbmZpZygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN1YlRhc2tEZXNjcmlwdGlvblRlbXBsYXRlOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YlRhc2tEZXNjcmlwdGlvblRlbXBsYXRlID0gUmVzb3VyY2VzLnRhc2tJbnN0YWxsaW5nRmFjZXQ7IAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ViVGFza0Rlc2NyaXB0aW9uVGVtcGxhdGUgPSBSZXNvdXJjZXMudGFza1VuaW5zdGFsbGluZ0ZhY2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJUYXNrRGVzY3JpcHRpb25UZW1wbGF0ZSA9IFJlc291cmNlcy50YXNrQ2hhbmdpbmdGYWNldFZlcnNpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdWJUYXNrRGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIHN1YlRhc2tEZXNjcmlwdGlvblRlbXBsYXRlLCBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRMYWJlbCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soIHN1YlRhc2tEZXNjcmlwdGlvbiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBwcmVFdmVudAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCggdGhpcywgZ2V0UHJlRXZlbnRUeXBlKCB0eXBlICksIGZ2LCBjb25maWcgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBwcmVFdmVudCApOwotICAgICAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgMTAgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJRGVsZWdhdGUgZGVsZWdhdGUgPSAoIChBY3Rpb25EZWZpbml0aW9uKSBkZWYgKS5nZXREZWxlZ2F0ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBkZWxlZ2F0ZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgODAgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbERlbGVnYXRlKCBmdiwgZGVsZWdhdGUsIGNvbmZpZywgdHlwZSwgc3VibW9uKCBtb25pdG9yLCA4MCApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhcHBseSggYWN0aW9uICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNhdmUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IHBvc3RFdmVudAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCggdGhpcywgZ2V0UG9zdEV2ZW50VHlwZSggdHlwZSApLCBmdiwgY29uZmlnICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBwb3N0RXZlbnQgKTsKLSAgICAgICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgZG9uZSggbW9uaXRvciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldD4gZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml4ZWRSZWFkT25seTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml4ZWQuY29udGFpbnMoIGZhY2V0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZmFjZXRzICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4gcmVzdWx0ID0gbmV3IE9iamVjdFJlZmVyZW5jZTxCb29sZWFuPiggdHJ1ZSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIHdyID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlZ2luTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KCBzZXRGaXhlZFByb2plY3RGYWNldHNJbnRlcm5hbCggZmFjZXRzLCBtb25pdG9yICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgd3MucnVuKCB3ciwgd3MuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCApOwotCi0gICAgICAgIGlmKCByZXN1bHQuZ2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBQcm9qZWN0TW9kaWZpZWRFdmVudCggdGhpcyApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldEZpeGVkUHJvamVjdEZhY2V0c0ludGVybmFsKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZmFjZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBiZWdpblRhc2soIG1vbml0b3IsICIiLCAyICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZU5vdERlbGV0ZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2V0PElQcm9qZWN0RmFjZXQ+IG9sZEZpeGVkRmFjZXRzID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3luY2hyb25pemVkKCBGYWNldGVkUHJvamVjdC50aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBlcXVhbHMoIHRoaXMuZml4ZWQsIGZhY2V0cyApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb2xkRml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0PiggdGhpcy5maXhlZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMuZml4ZWQuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkLmFkZEFsbCggZmFjZXRzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBzYXZlKCk7Ci0gICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLQotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRml4ZWRGYWNldHNDaGFuZ2VkRXZlbnQoIHRoaXMsIG9sZEZpeGVkRmFjZXRzLCBmYWNldHMgKSApOwotICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgZG9uZSggbW9uaXRvciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lKCBmaW5hbCBJUnVudGltZSBydW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU2V0IHJ1bnRpbWVzCi0gICAgICAgICAgICA9IHJ1bnRpbWUgPT0gbnVsbCAKLSAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIHJ1bnRpbWUgKTsKLSAgICAgICAgCi0gICAgICAgIHNldFRhcmdldGVkUnVudGltZXMoIHJ1bnRpbWVzLCBtb25pdG9yICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzVGFyZ2V0YWJsZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSApCi0gICAgewotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgcnVudGltZS5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RhcmdldGVkKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIGZvciggSVJ1bnRpbWUgciA6IGdldFRhcmdldGVkUnVudGltZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCByLmdldE5hbWUoKS5lcXVhbHMoIHJ1bnRpbWUuZ2V0TmFtZSgpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJUnVudGltZT4gZ2V0VGFyZ2V0ZWRSdW50aW1lcygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SVJ1bnRpbWU+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggU3RyaW5nIHJuYW1lIDogdGhpcy50YXJnZXRlZFJ1bnRpbWVzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBnZXRSdW50aW1lRnJvbU5hbWUoIHJuYW1lICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggcmVzdWx0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0ZWRSdW50aW1lcyggZmluYWwgU2V0PElSdW50aW1lPiBydW50aW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIE9iamVjdFJlZmVyZW5jZTxCb29sZWFuPiByZXN1bHQgPSBuZXcgT2JqZWN0UmVmZXJlbmNlPEJvb2xlYW4+KCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgd3IgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmVnaW5Nb2RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoIHNldFRhcmdldGVkUnVudGltZXNJbnRlcm5hbCggcnVudGltZXMsIG1vbml0b3IgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbmRNb2RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICB3cy5ydW4oIHdyLCB3cy5nZXRSb290KCksIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcmVzdWx0LmdldCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgUHJvamVjdE1vZGlmaWVkRXZlbnQoIHRoaXMgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRUYXJnZXRlZFJ1bnRpbWVzSW50ZXJuYWwoIGZpbmFsIFNldDxJUnVudGltZT4gcnVudGltZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBiZWdpblRhc2soIG1vbml0b3IsICIiLCAyICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZU5vdERlbGV0ZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiBvbGRSdW50aW1lczsKLSAgICAgICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gbmV3UnVudGltZXM7Ci0gICAgICAgICAgICBmaW5hbCBJUnVudGltZSBvbGRQcmltYXJ5OwotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgbmV3UHJpbWFyeTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB0aGlzLnRhcmdldGVkUnVudGltZXMuc2l6ZSgpID09IHJ1bnRpbWVzLnNpemUoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpZmZlcmVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogcnVudGltZXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISB0aGlzLnRhcmdldGVkUnVudGltZXMuY29udGFpbnMoIHIuZ2V0TmFtZSgpICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCAhIGRpZmZlcmVudCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHJ1bnRpbWUgOiBydW50aW1lcyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogdGhpcy5mYWNldHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISBydW50aW1lLnN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFjZXROb3RTdXBwb3J0ZWQsIHJ1bnRpbWUuZ2V0TG9jYWxpemVkTmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb2xkUnVudGltZXMgPSBuZXcgSGFzaFNldDxJUnVudGltZT4oIGdldFRhcmdldGVkUnVudGltZXMoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgcnVudGltZSA6IHJ1bnRpbWVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5hZGQoIHJ1bnRpbWUuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5ld1J1bnRpbWVzID0gbmV3IEhhc2hTZXQ8SVJ1bnRpbWU+KCBnZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBvbGRQcmltYXJ5ID0gZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgICAgICAgICBhc3NpZ25QcmltYXJ5UnVudGltZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgbmV3UHJpbWFyeSA9IGdldFByaW1hcnlSdW50aW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNhdmUoKTsKLSAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgMSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudCB0YXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50Ci0gICAgICAgICAgICAgICAgPSBuZXcgVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudCggdGhpcywgb2xkUnVudGltZXMsIG5ld1J1bnRpbWVzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggdGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBlcXVhbHMoIG9sZFByaW1hcnksIG5ld1ByaW1hcnkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQoIHRoaXMsIG9sZFByaW1hcnksIG5ld1ByaW1hcnkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBkb25lKCBtb25pdG9yICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVGFyZ2V0ZWRSdW50aW1lKCBmaW5hbCBJUnVudGltZSBydW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHJ1bnRpbWVzID0gbmV3IEhhc2hTZXQ8SVJ1bnRpbWU+KCBnZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKTsKLSAgICAgICAgcnVudGltZXMuYWRkKCBydW50aW1lICk7Ci0gICAgICAgIHNldFRhcmdldGVkUnVudGltZXMoIHJ1bnRpbWVzLCBtb25pdG9yICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhcmdldGVkUnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiBydW50aW1lcyA9IG5ldyBIYXNoU2V0PElSdW50aW1lPiggZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICk7Ci0gICAgICAgIHJ1bnRpbWVzLnJlbW92ZSggcnVudGltZSApOwotICAgICAgICBzZXRUYXJnZXRlZFJ1bnRpbWVzKCBydW50aW1lcywgbW9uaXRvciApOwotICAgIH0KLQotICAgIHB1YmxpYyBJUnVudGltZSBnZXRQcmltYXJ5UnVudGltZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnByaW1hcnlSdW50aW1lID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRSdW50aW1lRnJvbU5hbWUoIHRoaXMucHJpbWFyeVJ1bnRpbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5UnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4gcmVzdWx0ID0gbmV3IE9iamVjdFJlZmVyZW5jZTxCb29sZWFuPiggdHJ1ZSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIHdyID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlZ2luTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KCBzZXRQcmltYXJ5UnVudGltZUludGVybmFsKCBydW50aW1lLCBtb25pdG9yICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgd3MucnVuKCB3ciwgd3MuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJlc3VsdC5nZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IFByb2plY3RNb2RpZmllZEV2ZW50KCB0aGlzICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0UHJpbWFyeVJ1bnRpbWVJbnRlcm5hbCggZmluYWwgSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBiZWdpblRhc2soIG1vbml0b3IsICIiLCAyICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0ZU5vdERlbGV0ZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHJ1bnRpbWUgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBlcXVhbHMoIHRoaXMucHJpbWFyeVJ1bnRpbWUsIHJ1bnRpbWUuZ2V0TmFtZSgpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICEgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmNvbnRhaW5zKCBydW50aW1lLmdldE5hbWUoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gUmVzb3VyY2VzLm5ld1ByaW1hcnlOb3RUYXJnZXRSdW50aW1lOwotICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3QgPSBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIG9sZFByaW1hcnk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvbGRQcmltYXJ5ID0gZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gcnVudGltZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNhdmUoKTsKLSAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgMSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBQcmltYXJ5UnVudGltZUNoYW5nZWRFdmVudCggdGhpcywgb2xkUHJpbWFyeSwgcnVudGltZSApICk7Ci0gICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBkb25lKCBtb25pdG9yICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVJ1bnRpbWUgZ2V0UnVudGltZUZyb21OYW1lKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBJUnVudGltZSBydW50aW1lID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmKCBSdW50aW1lTWFuYWdlci5pc1J1bnRpbWVEZWZpbmVkKCBuYW1lICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBydW50aW1lID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZSggbmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZXMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHIuZ2V0QWx0ZXJuYXRlTmFtZXMoKS5jb250YWlucyggbmFtZSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgPSByOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBydW50aW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBydW50aW1lID0gbmV3IFVua25vd25SdW50aW1lKCBuYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBydW50aW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYXNzaWduUHJpbWFyeVJ1bnRpbWVJZk5lY2Vzc2FyeSgpCi0gICAgewotICAgICAgICBpZiggdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJpbWFyeVJ1bnRpbWUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMucHJpbWFyeVJ1bnRpbWUgPT0gbnVsbCB8fCAKLSAgICAgICAgICAgICAgICAhIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5jb250YWlucyggdGhpcy5wcmltYXJ5UnVudGltZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gdGhpcy50YXJnZXRlZFJ1bnRpbWVzLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZSggbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgYmVnaW5UYXNrKCBtb25pdG9yLCBSZXNvdXJjZXMudGFza1ZhbGlkYXRpbmdGYWNldGVkUHJvamVjdCwgNSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBwYXJzaW5nIHByb2JsZW1zLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0aGlzLnBhcnNpbmdFeGNlcHRpb24gIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5wYXJzaW5nRXhjZXB0aW9uIGluc3RhbmNlb2YgU0FYRXhjZXB0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMubWV0YWRhdGFGaWxlQ29ycnVwdGVkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmYuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuY291bGROb3RSZWFkTWV0YWRhdGFGaWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmYuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEFyZSBhbnkgb2YgdGhlIHRhcmdldCBydW50aW1lcyBub3QgZGVmaW5lZD8KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHIgOiBnZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHIgaW5zdGFuY2VvZiBVbmtub3duUnVudGltZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLnJ1bnRpbWVOb3REZWZpbmVkLCByLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gSXMgYW4gaW5zdGFsbGVkIGZhY2V0IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWU/Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSByIDogZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBnZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISByLnN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldE5vdFN1cHBvcnRlZEJ5VGFyZ2V0LCBmdi50b1N0cmluZygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRMb2NhbGl6ZWROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3b3JrZWQoIG1vbml0b3IsIDEgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBEb2VzIHRoZSBwcm9qZWN0IGNvbnRhaW4gYW55IHVua25vd24gZmFjZXRzIG9yIHZlcnNpb25zPwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBnZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggZi5nZXRQbHVnaW5JZCgpID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5pbnN0YWxsZWRGYWNldE5vdEZvdW5kLCBmLmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmdi5nZXRQbHVnaW5JZCgpID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmluc3RhbGxlZEZhY2V0VmVyc2lvbk5vdEZvdW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldElkKCksIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5hZGQoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdvcmtlZCggbW9uaXRvciwgMSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIHJlc3VsdC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZXJyb3JzLmlzRW1wdHkoKSAmJiB3YXJuaW5ncy5pc0VtcHR5KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMucHJvamVjdFZhbGlkYXRpb25GYWlsZWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1c1tdIHN0YXJyYXkgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBJU3RhdHVzWyBlcnJvcnMuc2l6ZSgpICsgd2FybmluZ3Muc2l6ZSgpIF07Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IGVycm9ycy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFycmF5WyBpIF0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmdldCggaSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gd2FybmluZ3Muc2l6ZSgpLCBvZmZzZXQgPSBlcnJvcnMuc2l6ZSgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgbjsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnJheVsgaSArIG9mZnNldCBdIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFN0YXR1cyggSVN0YXR1cy5XQVJOSU5HLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuZ2V0KCBpICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVN0YXR1cyggRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJyYXksIG1zZywgbnVsbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb25lKCBtb25pdG9yICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWVyZ2VDaGFuZ2VzKCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgT2JqZWN0UmVmZXJlbmNlPEJvb2xlYW4+IHJlc3VsdCA9IG5ldyBPYmplY3RSZWZlcmVuY2U8Qm9vbGVhbj4oIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSB3ciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiZWdpbk1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldCggbWVyZ2VDaGFuZ2VzSW50ZXJuYWwoIGZwandjLCBtb25pdG9yICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgd3MucnVuKCB3ciwgd3MuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvciApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJlc3VsdC5nZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IFByb2plY3RNb2RpZmllZEV2ZW50KCB0aGlzICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbWVyZ2VDaGFuZ2VzSW50ZXJuYWwoIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBTdWJNb25pdG9yIHBtID0gU3ViTW9uaXRvci5jb252ZXJ0KCBtb25pdG9yLCAyNiApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGV0aGVyIHdlIGNhbiBzZXQgcnVudGltZXMgYmVmb3JlIGFwcGx5aW5nIGZhY2V0IGFjdGlvbnMuIFRoaXMgaXMgYmV0dGVyCi0gICAgICAgICAgICAvLyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYnV0IG1heSBub3Qgd29yayBpZiB0aGUgcHJvamVjdCBjb250YWlucyBmYWNldHMgdGhhdCBhcmUKLSAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG5ldyBydW50aW1lLiBZb3UgY2FuIGdldCBpbnRvIHRoaXMgc2l0dWF0aW9uIGlmIHRoZSB1c2VyIHRyaWVzCi0gICAgICAgICAgICAvLyB0byBzaW11bHRhbmVvdXNseSB1bmluc3RhbGwgYSBmYWNldCBhbmQgc2VsZWN0IGEgZGlmZmVyZW50IHJ1bnRpbWUuIFRoZSBmYWxsYmFjawotICAgICAgICAgICAgLy8gc29sdXRpb24gZm9yIHRoaXMgc2l0dWF0aW9uIGlzIHRvIHNldCB0aGUgdGFyZ2V0ZWQgcnVudGltZXMgdG8gYW4gZW1wdHkgbGlzdCBmaXJzdCwKLSAgICAgICAgICAgIC8vIHRoZW4gYXBwbHkgdGhlIGZhY2V0IGFjdGlvbnMsIGFuZCB0aGVuIHNldCB0aGUgdGFyZ2V0ZWQgcnVudGltZXMgdG8gdGhlIG5ldyBsaXN0LgotICAgICAgICAgICAgLy8gVGhpcyBpcyBtb3JlIGRyYXN0aWMgdGhhbiBuZWNlc3NhcnkgaW4gYWxsIHNpdHVhdGlvbnMsIGJ1dCBpdCBpcyBub3QgY2xlYXIgdGhhdAotICAgICAgICAgICAgLy8gaW1wbGVtZW50aW5nIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpcyBuZWNlc3NhcnkgZWl0aGVyLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIGNhblNldFJ1bnRpbWVzRmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHIgOiBmcGp3Yy5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgci5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhblNldFJ1bnRpbWVzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGNhblNldFJ1bnRpbWVzRmlyc3QgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwbS5zdWJUYXNrKCBSZXNvdXJjZXMudGFza0NvbmZpZ3VyaW5nUnVudGltZXMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNhblNldFJ1bnRpbWVzRmlyc3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBzZXRUYXJnZXRlZFJ1bnRpbWVzSW50ZXJuYWwoIGZwandjLmdldFRhcmdldGVkUnVudGltZXMoKSwgc3VibW9uKCBwbSwgMiApICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZ2V0UHJpbWFyeVJ1bnRpbWUoKSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlSdW50aW1lSW50ZXJuYWwoIGZwandjLmdldFByaW1hcnlSdW50aW1lKCksIHN1Ym1vbiggcG0sIDIgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwbS53b3JrZWQoIDIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiBlbXB0eVNldCA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0gICAgICAgICAgICAgICAgc2V0VGFyZ2V0ZWRSdW50aW1lc0ludGVybmFsKCBlbXB0eVNldCwgc3VibW9uKCBwbSwgNCApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBtb2RpZnlJbnRlcm5hbCggZnBqd2MuZ2V0UHJvamVjdEZhY2V0QWN0aW9ucygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0ubmV3Q2hpbGQoIDE2LCBTdWJNb25pdG9yLlNVUFBSRVNTX1NFVFRBU0tOQU1FICkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBjYW5TZXRSdW50aW1lc0ZpcnN0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwbS5zdWJUYXNrKCBSZXNvdXJjZXMudGFza0NvbmZpZ3VyaW5nUnVudGltZXMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggc2V0VGFyZ2V0ZWRSdW50aW1lc0ludGVybmFsKCBmcGp3Yy5nZXRUYXJnZXRlZFJ1bnRpbWVzKCksIHN1Ym1vbiggcG0sIDIgKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGdldFByaW1hcnlSdW50aW1lKCkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggc2V0UHJpbWFyeVJ1bnRpbWVJbnRlcm5hbCggZnBqd2MuZ2V0UHJpbWFyeVJ1bnRpbWUoKSwgc3VibW9uKCBwbSwgMiApICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG0ud29ya2VkKCAyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggc2V0Rml4ZWRQcm9qZWN0RmFjZXRzSW50ZXJuYWwoIGZwandjLmdldEZpeGVkUHJvamVjdEZhY2V0cygpLCBzdWJtb24oIHBtLCAyICkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBwbS5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElNYXJrZXIgY3JlYXRlRXJyb3JNYXJrZXIoIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3JNYXJrZXIoIElGYWNldGVkUHJvamVjdFZhbGlkYXRvci5CQVNFX01BUktFUl9JRCwgbWVzc2FnZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBJTWFya2VyIGNyZWF0ZUVycm9yTWFya2VyKCBmaW5hbCBTdHJpbmcgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNYXJrZXIoIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIHR5cGUsIG1lc3NhZ2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElNYXJrZXIgY3JlYXRlV2FybmluZ01hcmtlciggZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXYXJuaW5nTWFya2VyKCBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuQkFTRV9NQVJLRVJfSUQsIG1lc3NhZ2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElNYXJrZXIgY3JlYXRlV2FybmluZ01hcmtlciggZmluYWwgU3RyaW5nIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlTWFya2VyKCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIHR5cGUsIG1lc3NhZ2UgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJTWFya2VyIGNyZWF0ZU1hcmtlciggZmluYWwgaW50IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJTWFya2VyW10gZXhpc3RpbmcKLSAgICAgICAgICAgID0gdGhpcy5wcm9qZWN0LmZpbmRNYXJrZXJzKCB0eXBlLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8gKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZXhpc3RpbmcubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJTWFya2VyIG0gPSBleGlzdGluZ1sgaSBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbS5nZXRBdHRyaWJ1dGUoIElNYXJrZXIuU0VWRVJJVFksIC0xICkgPT0gc2V2ZXJpdHkgJiYKLSAgICAgICAgICAgICAgICBtLmdldEF0dHJpYnV0ZSggSU1hcmtlci5NRVNTQUdFLCAiIiApLmVxdWFscyggbWVzc2FnZSApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJTWFya2VyIG0gPSB0aGlzLnByb2plY3QuY3JlYXRlTWFya2VyKCB0eXBlICk7Ci0gICAgICAKLSAgICAgICAgbS5zZXRBdHRyaWJ1dGUoIElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSApOyAKLSAgICAgICAgbS5zZXRBdHRyaWJ1dGUoIElNYXJrZXIuU0VWRVJJVFksIHNldmVyaXR5ICk7Ci0gICAgICAKLSAgICAgICAgcmV0dXJuIG07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMubm90aWZ5TGlzdGVuZXJzKCBldmVudCApOwotICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0TGlzdGVuZXJSZWdpc3RyeSgpLm5vdGlmeUxpc3RlbmVycyggZXZlbnQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkTGlzdGVuZXIoIG5ldyBMZWdhY3lMaXN0ZW5lckFkYXB0ZXIoIGxpc3RlbmVyICksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVEICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgeCAKLSAgICAgICAgICAgICA6IHRoaXMubGlzdGVuZXJzLmdldExpc3RlbmVycyggSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVEICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggeCBpbnN0YW5jZW9mIExlZ2FjeUxpc3RlbmVyQWRhcHRlciAmJgotICAgICAgICAgICAgICAgICggKExlZ2FjeUxpc3RlbmVyQWRhcHRlcikgeCApLmdldExlZ2FjeUxpc3RlbmVyKCkgPT0gbGlzdGVuZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKCB4ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmVnaW5Nb2RpZmljYXRpb24oKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoIHRoaXMuaXNCZWluZ01vZGlmaWVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5tb2RpZmllclRocmVhZCA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBSZXNvdXJjZXMuaWxsZWdhbE1vZGlmaWNhdGlvbk1zZzsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdCA9IEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3QgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2sud2FpdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuaXNCZWluZ01vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHRoaXMubW9kaWZpZXJUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBlbmRNb2RpZmljYXRpb24oKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlzQmVpbmdNb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgdGhpcy5tb2RpZmllclRocmVhZCA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLmxvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSBnZXRQcmVFdmVudFR5cGUoIGZpbmFsIEFjdGlvbi5UeXBlIHQgKQotICAgIHsKLSAgICAgICAgaWYoIHQgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9JTlNUQUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHQgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX1VOSU5TVEFMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCB0ID09IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX1ZFUlNJT05fQ0hBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUgZ2V0UG9zdEV2ZW50VHlwZSggZmluYWwgQWN0aW9uLlR5cGUgdCApCi0gICAgewotICAgICAgICBpZiggdCA9PSBBY3Rpb24uVHlwZS5JTlNUQUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUE9TVF9JTlNUQUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHQgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUE9TVF9VTklOU1RBTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdCA9PSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfVkVSU0lPTl9DSEFOR0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FsbERlbGVnYXRlKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRGVsZWdhdGUgZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0cmFjaW5nRGVsZWdhdGVDYWxsc1N0cgotICAgICAgICAgICAgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbiggVFJBQ0lOR19ERUxFR0FURV9DQUxMUyApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFjaW5nRGVsZWdhdGVDYWxscyAKLSAgICAgICAgICAgID0gdHJhY2luZ0RlbGVnYXRlQ2FsbHNTdHIgPT0gbnVsbCA/IGZhbHNlIAotICAgICAgICAgICAgICA6IHRyYWNpbmdEZWxlZ2F0ZUNhbGxzU3RyLmVxdWFscyggInRydWUiICk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBsb25nIHRpbWVTdGFydGVkID0gLTE7Ci0gICAgICAgIAotICAgICAgICBpZiggdHJhY2luZ0RlbGVnYXRlQ2FsbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLnRyYWNpbmdEZWxlZ2F0ZVN0YXJ0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYuZ2V0VmVyc2lvblN0cmluZygpLCBjb250ZXh0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBtc2cgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGltZVN0YXJ0ZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGVnYXRlLmV4ZWN1dGUoIHRoaXMucHJvamVjdCwgZnYsIGNvbmZpZywgbW9uaXRvciApOyAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY29udGV4dCA9PSBBY3Rpb24uVHlwZS5JTlNUQUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhaWxlZE9uSW5zdGFsbCwgZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNvbnRleHQgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhaWxlZE9uVW5pbnN0YWxsLCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY29udGV4dCA9PSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWlsZWRPblZlcnNpb25DaGFuZ2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRMYWJlbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggY29udGV4dC50b1N0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3RhdHVzCi0gICAgICAgICAgICAgICAgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgZSApOwotCi0gICAgICAgICAgICBmaW5hbCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbiB3cmFwcGVyIAotICAgICAgICAgICAgICAgID0gbmV3IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uKCBzdGF0dXMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGUgaW5zdGFuY2VvZiBGYWNldGVkUHJvamVjdEZyYW1ld29ya0V4Y2VwdGlvbiAmJgotICAgICAgICAgICAgICAgICggKEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uKSBlICkuaXNFeHBlY3RlZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyLnNldEV4cGVjdGVkKCB0cnVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IHdyYXBwZXI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCB0cmFjaW5nRGVsZWdhdGVDYWxscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWVTdGFydGVkOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy50cmFjaW5nRGVsZWdhdGVGaW5pc2hlZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoIGR1cmF0aW9uICkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBtc2cgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYXBwbHkoIGZpbmFsIEFjdGlvbiBhY3Rpb24gKQotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uLlR5cGUgdHlwZSA9IGFjdGlvbi5nZXRUeXBlKCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLklOU1RBTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY2V0cy5hZGQoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY2V0cy5yZW1vdmUoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24geCA6IHRoaXMuZmFjZXRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggeC5nZXRQcm9qZWN0RmFjZXQoKSA9PSBmdi5nZXRQcm9qZWN0RmFjZXQoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2V0cy5yZW1vdmUoIHggKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmZhY2V0cy5hZGQoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNhdmUoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBmaW5hbCBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoIHcgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBubCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBvdXQucHJpbnQoICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgb3V0LnByaW50KCBubCApOwotICAgICAgICBvdXQucHJpbnQoICI8ZmFjZXRlZC1wcm9qZWN0PiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdXQucHJpbnQoIG5sICk7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5wcmltYXJ5UnVudGltZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50KCAiICA8cnVudGltZSBuYW1lPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBvdXQucHJpbnQoIGVzY2FwZSggdGhpcy5wcmltYXJ5UnVudGltZSApICk7Ci0gICAgICAgICAgICBvdXQucHJpbnQoICJcIi8+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBvdXQucHJpbnQoIG5sICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggU3RyaW5nIG5hbWUgOiB0aGlzLnRhcmdldGVkUnVudGltZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISBuYW1lLmVxdWFscyggdGhpcy5wcmltYXJ5UnVudGltZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoICIgIDxzZWNvbmRhcnktcnVudGltZSBuYW1lPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgb3V0LnByaW50KCBlc2NhcGUoIG5hbWUgKSApOwotICAgICAgICAgICAgICAgIG91dC5wcmludCggIlwiLz4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIG5sICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldCBmIDogdGhpcy5maXhlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC5wcmludCggIiAgPGZpeGVkIGZhY2V0PVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBvdXQucHJpbnQoIGVzY2FwZSggZi5nZXRJZCgpICkgKTsKLSAgICAgICAgICAgIG91dC5wcmludCggIlwiLz4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5wcmludCggbmwgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuZmFjZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50KCAiICA8aW5zdGFsbGVkIGZhY2V0PVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBvdXQucHJpbnQoIGVzY2FwZSggZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSApICk7Ci0gICAgICAgICAgICBvdXQucHJpbnQoICJcIiB2ZXJzaW9uPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBvdXQucHJpbnQoIGVzY2FwZSggZnYuZ2V0VmVyc2lvblN0cmluZygpICkgKTsKLSAgICAgICAgICAgIG91dC5wcmludCggIlwiLz4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG91dC5wcmludCggbmwgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3V0LnByaW50KCAiPC9mYWNldGVkLXByb2plY3Q+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG91dC5wcmludCggbmwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlczsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlcyA9IHcuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKS5nZXRCeXRlcyggIlVURi04IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQuIEFsbCBKVk1zIGFyZSBzdXBwb3NlZCB0byBzdXBwb3J0IFVURi04LgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIGJ5dGVzICk7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5mLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVFZGl0KCB0aGlzLmYgKTsKLSAgICAgICAgICAgIHRoaXMuZi5zZXRDb250ZW50cyggaW4sIHRydWUsIGZhbHNlLCBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRm9sZGVyIHBhcmVudCA9IChJRm9sZGVyKSB0aGlzLmYuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIHBhcmVudC5leGlzdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFyZW50LmNyZWF0ZSggdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmYuY3JlYXRlKCBpbiwgdHJ1ZSwgbnVsbCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZNb2RpZmljYXRpb25TdGFtcCA9IHRoaXMuZi5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotICAgICAgICB0aGlzLnBhcnNpbmdFeGNlcHRpb24gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJlZnJlc2goIGZhbHNlICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoKCBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6aW5nICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLmlzQmVpbmdNb2RpZmllZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5mLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgPT0gdGhpcy5mTW9kaWZpY2F0aW9uU3RhbXAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYmVnaW5Nb2RpZmljYXRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5mYWNldHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy51bmtub3duRmFjZXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgdGhpcy5mLmV4aXN0cygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZk1vZGlmaWNhdGlvblN0YW1wID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZk1vZGlmaWNhdGlvblN0YW1wID0gdGhpcy5mLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSBwYXJzZSggdGhpcy5mLmdldExvY2F0aW9uKCkudG9GaWxlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2luZ0V4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzaW5nRXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMucGFyc2luZ0V4Y2VwdGlvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudFtdIGVsZW1lbnRzID0gY2hpbGRyZW4oIHJvb3QgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlID0gZWxlbWVudHNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbmFtZS5lcXVhbHMoIEVMX1JVTlRJTUUgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gZS5nZXRBdHRyaWJ1dGUoIEFUVFJfTkFNRSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMuYWRkKCB0aGlzLnByaW1hcnlSdW50aW1lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG5hbWUuZXF1YWxzKCBFTF9TRUNPTkRBUllfUlVOVElNRSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5hZGQoIGUuZ2V0QXR0cmlidXRlKCBBVFRSX05BTUUgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBuYW1lLmVxdWFscyggRUxfRklYRUQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBlLmdldEF0dHJpYnV0ZSggQVRUUl9GQUNFVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBpZCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVVbmtub3duRmFjZXQoIGlkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZml4ZWQuYWRkKCBmICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG5hbWUuZXF1YWxzKCBFTF9JTlNUQUxMRUQgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBlLmdldEF0dHJpYnV0ZSggQVRUUl9GQUNFVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiA9IGUuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGlkICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBpZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVVua25vd25GYWNldCggaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZi5oYXNWZXJzaW9uKCB2ZXJzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdiA9IGYuZ2V0VmVyc2lvbiggdmVyc2lvbiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYgPSBjcmVhdGVVbmtub3duRmFjZXRWZXJzaW9uKCBmLCB2ZXJzaW9uICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2V0cy5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVuZE1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUsIHRoZSBwcm9qZWN0IHdhcyBjaGFuZ2VkLiBBbGwgb2YgdGhlIG5vLW9wIGNoZWNrcyByZXR1cm4gZWFybHkuIFRoZQotICAgICAgICAvLyBleGNlcHRpb24gaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGZhY2V0ZWQgcHJvamVjdCBpcyBiZWluZyBpbml0aWFsaXplZCBmb3IgdGhlIGZpcnN0Ci0gICAgICAgIC8vIHRpbWUgaW4gdGhlIHdvcmtiZW5jaCBzZXNzaW9uIChmb3IgaW5zdGFuY2UgYWZ0ZXIgd29ya2JlbmNoIHJlc3RhcnQgb3Igd2hlbiBhbiAKLSAgICAgICAgLy8gZXhpc3RpbmcgZmFjZXRlZCBwcm9qZWN0IGlzIGltcG9ydGVkIGludG8gdGhlIHdvcmtzcGFjZSkuCi0gICAgICAgIAotICAgICAgICBpZiggISBpc0luaXRpYWxpemluZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IFByb2plY3RNb2RpZmllZEV2ZW50KCB0aGlzICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2b2lkIG1hcmtEZWxldGVkKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJlZ2luTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5maXhlZC5jbGVhcigpOwotICAgICAgICAgICAgICAgIHRoaXMudW5rbm93bkZhY2V0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIHRoaXMucHJpbWFyeVJ1bnRpbWUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVuZE1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmlzRGVsZXRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTm90RGVsZXRlZCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuaXNEZWxldGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFJlc291cmNlcy5jYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdDsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBQcm9qZWN0RmFjZXQgY3JlYXRlVW5rbm93bkZhY2V0KCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgUHJvamVjdEZhY2V0IGYgPSB0aGlzLnVua25vd25GYWNldHMuZ2V0KCBpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGYgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGYgPSBuZXcgUHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICBmLnNldElkKCBpZCApOwotICAgICAgICAgICAgZi5zZXRMYWJlbCggaWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy51bmtub3duRmFjZXRzLnB1dCggaWQsIGYgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUHJvamVjdEZhY2V0VmVyc2lvbiBjcmVhdGVVbmtub3duRmFjZXRWZXJzaW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFByb2plY3RGYWNldFZlcnNpb24gZnY7Ci0gICAgICAgIAotICAgICAgICBpZiggZi5oYXNWZXJzaW9uKCB2ZXJzaW9uICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmdiA9IChQcm9qZWN0RmFjZXRWZXJzaW9uKSBmLmdldFZlcnNpb24oIHZlcnNpb24gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZ2ID0gbmV3IFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgIGZ2LnNldFByb2plY3RGYWNldCggKFByb2plY3RGYWNldCkgZiApOwotICAgICAgICAgICAgZnYuc2V0VmVyc2lvblN0cmluZyggdmVyc2lvbiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZnY7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEVsZW1lbnQgcGFyc2UoIGZpbmFsIEZpbGUgZiApCi0gICAgCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyIGRvY2J1aWxkZXI7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5IAotICAgICAgICAgICAgICAgID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoIGZhbHNlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRvY2J1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkb2NidWlsZGVyLnNldEVudGl0eVJlc29sdmVyCi0gICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgbmV3IEVudGl0eVJlc29sdmVyKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KCBmaW5hbCBTdHJpbmcgcHVibGljSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN5c3RlbUlEICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZSggbmV3IFN0cmluZ1JlYWRlciggIiIgKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRvY2J1aWxkZXIucGFyc2UoIGYgKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBFbGVtZW50W10gY2hpbGRyZW4oIGZpbmFsIEVsZW1lbnQgZWxlbWVudCApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7Ci0gICAgICAgIGZpbmFsIE5vZGVMaXN0IG5sID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IG5sLmdldExlbmd0aCgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTm9kZSBub2RlID0gbmwuaXRlbSggaSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZCggKEVsZW1lbnQpIG5vZGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSggbmV3IEVsZW1lbnRbIGxpc3Quc2l6ZSgpIF0gKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoIGZpbmFsIE9iamVjdCBvYmoxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqMiApCi0gICAgewotICAgICAgICBpZiggb2JqMSA9PSBvYmoyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggb2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvYmoxLmVxdWFscyggb2JqMiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZE9uSW5zdGFsbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkT25Vbmluc3RhbGw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZE9uVmVyc2lvbkNoYW5nZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFjZXROb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldFZlcnNpb25Ob3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldE5vdFN1cHBvcnRlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWxsZWdhbE1vZGlmaWNhdGlvbk1zZzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhY2luZ0RlbGVnYXRlU3RhcnRpbmc7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYWNpbmdEZWxlZ2F0ZUZpbmlzaGVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQcmltYXJ5Tm90VGFyZ2V0UnVudGltZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90TW9kaWZ5RGVsZXRlZFByb2plY3Q7Ci0gICAgICAgIAotICAgICAgICAvLyBUYXNrIERlc2NyaXB0aW9ucwotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1ZhbGlkYXRpbmdGYWNldGVkUHJvamVjdDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0luc3RhbGxpbmdGYWNldDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1VuaW5zdGFsbGluZ0ZhY2V0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2hhbmdpbmdGYWNldFZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDb25maWd1cmluZ1J1bnRpbWVzOwotICAgICAgICAKLSAgICAgICAgLy8gVmFsaWRhdGlvbiBNZXNzYWdlcwotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvamVjdFZhbGlkYXRpb25GYWlsZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGFkYXRhRmlsZUNvcnJ1cHRlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY291bGROb3RSZWFkTWV0YWRhdGFGaWxlOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lTm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFjZXROb3RTdXBwb3J0ZWRCeVRhcmdldDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGVkRmFjZXROb3RGb3VuZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGVkRmFjZXRWZXJzaW9uTm90Rm91bmQ7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBGYWNldGVkUHJvamVjdC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYmluZCggZmluYWwgU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIG1zZywgbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCB9ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmJhNWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1mYWlsZWRPbkluc3RhbGwgPSBGYWlsZWQgd2hpbGUgaW5zdGFsbGluZyB7MH0uCi1mYWlsZWRPblVuaW5zdGFsbCA9IEZhaWxlZCB3aGlsZSB1bmluc3RhbGxpbmcgezB9LgotZmFpbGVkT25WZXJzaW9uQ2hhbmdlID0gRmFpbGVkIHdoaWxlIGNoYW5naW5nIHZlcnNpb24gb2YgezB9IHRvIHsxfS4KLWZhY2V0Tm90RGVmaW5lZCA9IEZhY2V0IHswfSBpcyBub3QgZGVmaW5lZC4KLWZhY2V0VmVyc2lvbk5vdERlZmluZWQgPSBWZXJzaW9uIHsxfSBvZiBmYWNldCB7MH0gaXMgbm90IGRlZmluZWQuCi1mYWNldE5vdFN1cHBvcnRlZCA9IFJ1bnRpbWUgezB9IGRvZXMgbm90IHN1cHBvcnQgcHJvamVjdCBmYWNldCB7MX0uCi1pbGxlZ2FsTW9kaWZpY2F0aW9uTXNnID0gQ2Fubm90IG1vZGlmeSBmYWNldGVkIHByb2plY3QgZnJvbSB3aXRoaW4gYSBmYWNldCBkZWxlZ2F0ZS4KLXRyYWNpbmdEZWxlZ2F0ZVN0YXJ0aW5nID0gXAotQ2FsbGluZyBwcm9qZWN0IGZhY2V0IGRlbGVnYXRlOlxuXAotXCAgZmFjZXQ6IHswfSA6IHsxfVxuXAotXCAgdHlwZTogIHsyfVxuXAotXCAgY2xhc3M6IHszfQotdHJhY2luZ0RlbGVnYXRlRmluaXNoZWQgPSBQcm9qZWN0IGZhY2V0IGRlbGVnYXRlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgaW4gezB9IG1zLgotbmV3UHJpbWFyeU5vdFRhcmdldFJ1bnRpbWUgPSBQcmltYXJ5IHJ1bnRpbWUgaGFzIHRvIGJlIG9uZSBvZiB0aGUgdGFyZ2V0ZWQgcnVudGltZXMuCi1jYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdCA9IENhbm5vdCBtb2RpZnkgYSBkZWxldGVkIHByb2plY3QuCi0KLSMgVGFzayBEZXNjcmlwdGlvbnMKLQotdGFza1ZhbGlkYXRpbmdGYWNldGVkUHJvamVjdCA9IFZhbGlkYXRpbmcgZmFjZXRlZCBwcm9qZWN0Li4uCi10YXNrSW5zdGFsbGluZ0ZhY2V0ID0gSW5zdGFsbGluZyB7MH0gZmFjZXQuLi4KLXRhc2tVbmluc3RhbGxpbmdGYWNldCA9IFVuaW5zdGFsbGluZyB7MH0gZmFjZXQuLi4KLXRhc2tDaGFuZ2luZ0ZhY2V0VmVyc2lvbiA9IENoYW5naW5nIHZlcnNpb24gb2YgezB9IGZhY2V0Li4uCi10YXNrQ29uZmlndXJpbmdSdW50aW1lcyA9IENvbmZpZ3VyaW5nIHRhcmdldGVkIHJ1bnRpbWVzLi4uCi0KLSMgVmFsaWRhdGlvbiBNZXNzYWdlcwotCi1wcm9qZWN0VmFsaWRhdGlvbkZhaWxlZCA9IEVuY291bnRlcmVkIHByb2JsZW1zIHdoaWxlIHZhbGlkYXRpbmcgZmFjZXRlZCBwcm9qZWN0ICJ7MH0iLgotbWV0YWRhdGFGaWxlQ29ycnVwdGVkID0gRmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGZpbGUgInswfSIgaXMgY29ycnVwdGVkIGFuZCBjb3VsZCBub3QgYmUgcGFyc2VkLgotY291bGROb3RSZWFkTWV0YWRhdGFGaWxlID0gRmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGZpbGUgInswfSIgY291bGQgbm90IGJlIHJlYWQuCi1ydW50aW1lTm90RGVmaW5lZCA9IFRhcmdldCBydW50aW1lIHswfSBpcyBub3QgZGVmaW5lZC4KLWZhY2V0Tm90U3VwcG9ydGVkQnlUYXJnZXQgPSBQcm9qZWN0IGZhY2V0IHswfSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRhcmdldCBydW50aW1lIHsxfS4KLWluc3RhbGxlZEZhY2V0Tm90Rm91bmQgPSBJbXBsZW1lbnRhdGlvbiBvZiBwcm9qZWN0IGZhY2V0IHswfSBjb3VsZCBub3QgYmUgZm91bmQuIEZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBsaW1pdGVkLgotaW5zdGFsbGVkRmFjZXRWZXJzaW9uTm90Rm91bmQgPSBJbXBsZW1lbnRhdGlvbiBvZiB2ZXJzaW9uIHsxfSBvZiBwcm9qZWN0IGZhY2V0IHswfSBjb3VsZCBub3QgYmUgZm91bmQuIEZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBsaW1pdGVkLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4YTZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBBZGFwdHMge0BsaW5rIElQcm9qZWN0fSB0byB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0fS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0QWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElGYWNldGVkUHJvamVjdC5jbGFzcyB9OwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlciggZmluYWwgT2JqZWN0IGFkYXB0YWJsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgewotICAgICAgICBpZiggYWRhcHRlclR5cGUgPT0gSUZhY2V0ZWRQcm9qZWN0LmNsYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggKElQcm9qZWN0KSBhZGFwdGFibGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1MTBkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLkZpbGVVdGlsLkZJTEVfRE9UX1BST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuRmlsZVV0aWwudmFsaWRhdGVFZGl0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZE9wdGlvbmFsRWxlbWVudDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmZpbmRSZXF1aXJlZEF0dHJpYnV0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldEVsZW1lbnRWYWx1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwucmVwb3J0TWlzc2luZ0F0dHJpYnV0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLnJlcG9ydE1pc3NpbmdFbGVtZW50OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlZmF1bHRWZXJzaW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb25FeHByOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5pbnRlcm5hbC5FdmVudHNFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuRnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuTGVnYWN5RXZlbnRIYW5kbGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuaW50ZXJuYWwuUHJvamVjdExpc3RlbmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5JbmRleGVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVmVyc2lvbkV4cHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLkludmFsaWRFeHRlbnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBQcm9qZWN0RmFjZXRzTWFuYWdlcn0gYWJzdHJhY3QgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0lEID0gImZhY2V0cyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBQ0VUID0gImZhY2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0dST1VQID0gImdyb3VwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9WSURFUiA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TT0ZUID0gInNvZnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfQUNUSU9OID0gImFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0NPTkZJR19GQUNUT1JZID0gImNvbmZpZy1mYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9DT05TVFJBSU5UID0gImNvbnN0cmFpbnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0RFRkFVTFRfVkVSU0lPTiA9ICJkZWZhdWx0LXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0RFTEVHQVRFID0gImRlbGVnYXRlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRVZFTlRfSEFORExFUiA9ICJldmVudC1oYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9HUk9VUCA9ICJncm91cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfR1JPVVBfTUVNQkVSID0gImdyb3VwLW1lbWJlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX01FTUJFUiA9ICJtZW1iZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1BST0pFQ1RfRkFDRVQgPSAicHJvamVjdC1mYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUFJPSkVDVF9GQUNFVF9WRVJTSU9OID0gInByb2plY3QtZmFjZXQtdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1ZFUlNJT05fQ09NUEFSQVRPUiA9ICJ2ZXJzaW9uLWNvbXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVTQ1JJUFRJT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbCBpbnN0YW5jZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gZmFjZXRzUmVwb3J0ZWRNaXNzaW5nID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgSW5kZXhlZFNldDxTdHJpbmcsSVByb2plY3RGYWNldD4gZmFjZXRzOwotICAgIHByaXZhdGUgZmluYWwgSW5kZXhlZFNldDxTdHJpbmcsSUFjdGlvbkRlZmluaXRpb24+IGFjdGlvbnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxJQ2F0ZWdvcnk+IGNhdGVnb3JpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxJUHJlc2V0PiBwcmVzZXRzOwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmVzZXRzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGZpbmFsIEluZGV4ZWRTZXQ8U3RyaW5nLElHcm91cD4gZ3JvdXBzOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxGYWNldGVkUHJvamVjdD4gcHJvamVjdHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0TGlzdGVuZXJSZWdpc3RyeSBwcm9qZWN0TGlzdGVuZXJSZWdpc3RyeTsKLSAgICBwcml2YXRlIGZpbmFsIEZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkgZnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeTsKLSAgICAKLSAgICBwcml2YXRlIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbCgpCi0gICAgewotICAgICAgICBsb25nIGFjdGl2YXRpb25TdGFydCA9IDA7Ci0gICAgICAgIAotICAgICAgICBpZiggRmFjZXRDb3JlUGx1Z2luLmlzVHJhY2luZ0ZyYW1ld29ya0FjdGl2YXRpb24oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKCBzdyApOwotICAgICAgICAgICAgKCBuZXcgVGhyb3dhYmxlKCkgKS5wcmludFN0YWNrVHJhY2UoIHB3ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBjb250ZXh0ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBlbmRPZkZpcnN0TGluZSA9IGNvbnRleHQuaW5kZXhPZiggJ1xuJyApOwotICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQuc3Vic3RyaW5nKCBlbmRPZkZpcnN0TGluZSArIDEgKTsKLSAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2VBbGwoICJcXHQiLCAiICAiICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gY29udGV4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNvbnRleHQuY2hhckF0KCBsZW5ndGggLSAyICkgPT0gJ1xyJyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIC0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5zdWJzdHJpbmcoIDAsIGxlbmd0aCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy50cmFjaW5nRnJhbWV3b3JrQWN0aXZhdGlvblN0YXJ0aW5nLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ICk7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIG1zZyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhY3RpdmF0aW9uU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5mYWNldHMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSVByb2plY3RGYWNldD4oKTsKLSAgICAgICAgdGhpcy5hY3Rpb25zID0gbmV3IEluZGV4ZWRTZXQ8U3RyaW5nLElBY3Rpb25EZWZpbml0aW9uPigpOwotICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSUNhdGVnb3J5PigpOwotICAgICAgICB0aGlzLnByZXNldHMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSVByZXNldD4oKTsKLSAgICAgICAgdGhpcy5wcmVzZXRzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgdGhpcy5ncm91cHMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSUdyb3VwPigpOwotICAgICAgICB0aGlzLnByb2plY3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEZhY2V0ZWRQcm9qZWN0PigpOwotICAgICAgICB0aGlzLnByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5ID0gbmV3IFByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5KCk7Ci0gICAgICAgIHRoaXMuZnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeSA9IG5ldyBGcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5KCk7Ci0gICAgICAgIAotICAgICAgICByZWFkTWV0YWRhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIEV2ZW50c0V4dGVuc2lvblBvaW50LnByb2Nlc3NFeHRlbnNpb25zKCB0aGlzICk7Ci0gICAgICAgIAotICAgICAgICAoIG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgKS5yZWdpc3RlcigpOwotICAgICAgICAKLSAgICAgICAgaWYoIEZhY2V0Q29yZVBsdWdpbi5pc1RyYWNpbmdGcmFtZXdvcmtBY3RpdmF0aW9uKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGR1cmF0aW9uIAotICAgICAgICAgICAgICAgID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBhY3RpdmF0aW9uU3RhcnQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMudHJhY2luZ0ZyYW1ld29ya0FjdGl2YXRpb25GaW5pc2hlZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoIGR1cmF0aW9uICkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBtc2cgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwgZ2V0SW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgaWYoIGluc3RhbmNlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXQ+IGdldFByb2plY3RGYWNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmdldFVubW9kaWZpYWJsZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RGYWNldERlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuY29udGFpbnNLZXkoIGlkICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0IGdldFByb2plY3RGYWNldCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IHRoaXMuZmFjZXRzLmdldCggaWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldE5vdERlZmluZWQsIGlkICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IGdldEFjdGlvbkRlZmluaXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uRGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMuY29udGFpbnNLZXkoIGlkICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUFjdGlvbkRlZmluaXRpb24gYWRlZiA9IHRoaXMuYWN0aW9ucy5nZXQoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggYWRlZiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuYWN0aW9uTm90RGVmaW5lZCwgaWQgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG1zZyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYWRlZjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJQ2F0ZWdvcnk+IGdldENhdGVnb3JpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllcy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhdGVnb3J5RGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3JpZXMuY29udGFpbnNLZXkoIGlkICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBmaW5hbCBJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3JpZXMuZ2V0KCBpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGNhdGVnb3J5ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5jYXRlZ29yeU5vdERlZmluZWQsIGlkICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcmVzZXQ+IGdldFByZXNldHMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLnByZXNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplUHJlc2V0cygpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlc2V0cy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNldERlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMucHJlc2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVQcmVzZXRzKCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVzZXRzLmNvbnRhaW5zS2V5KCBpZCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJlc2V0IGdldFByZXNldCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5wcmVzZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZVByZXNldHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQgPSB0aGlzLnByZXNldHMuZ2V0KCBpZCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcHJlc2V0ID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLnByZXNldE5vdERlZmluZWQsIGlkICk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggbXNnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBwcmVzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcmVzZXQgZGVmaW5lUHJlc2V0KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWZpbmVQcmVzZXQoIG5hbWUsIG51bGwsIGZhY2V0cyApOwotICAgIH0KLQotICAgIHB1YmxpYyBJUHJlc2V0IGRlZmluZVByZXNldCggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyApCi0gICAgewotICAgICAgIGluaXRpYWxpemVQcmVzZXRzKCk7Ci0gICAgICAgCi0gICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQgPSBkZWZpbmVQcmVzZXQoIG5hbWUsIGRlc2NyaXB0aW9uLCBmYWNldHMsIHRydWUgKTsKLQotICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50IGV2ZW50IAotICAgICAgICAgICA9IG5ldyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50KCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFdmVudC5UeXBlLlBSRVNFVF9BRERFRCApOwotICAgICAgIAotICAgICAgIHRoaXMuZnJhbWV3b3JrTGlzdGVuZXJSZWdpc3RyeS5ub3RpZnlMaXN0ZW5lcnMoIGV2ZW50ICk7Ci0gICAgICAgCi0gICAgICAgcmV0dXJuIHByZXNldDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUHJlc2V0IGRlZmluZVByZXNldCggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2F2ZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMucHJlc2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBpZDsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZCA9ICIudXNyLiIgKyBpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUoIHRoaXMucHJlc2V0cy5jb250YWluc0tleSggaWQgKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBVc2VyUHJlc2V0IHByZXNldCAKLSAgICAgICAgICAgICAgICA9IG5ldyBVc2VyUHJlc2V0KCBpZCwgbmFtZSwgZGVzY3JpcHRpb24gPT0gbnVsbCA/ICIiIDogZGVzY3JpcHRpb24sICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMucHJlc2V0cy5hZGQoIGlkLCBwcmVzZXQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHNhdmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNhdmVVc2VyUHJlc2V0cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcHJlc2V0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVByZXNldCggZmluYWwgSVByZXNldCBwcmVzZXQgKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxldGVkOwotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLnByZXNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplUHJlc2V0cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcHJlc2V0LmdldFR5cGUoKSAhPSBJUHJlc2V0LlR5cGUuVVNFUl9ERUZJTkVEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRlbGV0ZWQgPSB0aGlzLnByZXNldHMuZGVsZXRlKCBwcmVzZXQuZ2V0SWQoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZGVsZXRlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2F2ZVVzZXJQcmVzZXRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggZGVsZXRlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50IGV2ZW50IAotICAgICAgICAgICAgICAgID0gbmV3IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQoIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUuUFJFU0VUX1JFTU9WRUQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5Lm5vdGlmeUxpc3RlbmVycyggZXZlbnQgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJlc2V0cygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMucHJlc2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIHRoaXMucHJlc2V0c0luaXRpYWxpemVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoIElQcmVzZXQgcHJlc2V0IDogUHJlc2V0c0V4dGVuc2lvblBvaW50LmdldFByZXNldHMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXNldHMuYWRkKCBwcmVzZXQuZ2V0SWQoKSwgcHJlc2V0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlYWRVc2VyUHJlc2V0cygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRoaXMucHJlc2V0c0luaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2F2ZVVzZXJQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlcyByb290ID0gZ2V0VXNlclByZXNldHNQcmVmZXJlbmNlcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBjaGlsZHJlbiA9IHJvb3QuY2hpbGRyZW5OYW1lcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb290Lm5vZGUoIGNoaWxkcmVuWyBpIF0gKS5yZW1vdmVOb2RlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVByZXNldCBwcmVzZXQgOiB0aGlzLnByZXNldHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwcmVzZXQuZ2V0VHlwZSgpID09IElQcmVzZXQuVHlwZS5VU0VSX0RFRklORUQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZXMgcG5vZGUgPSByb290Lm5vZGUoIHByZXNldC5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBub2RlLnB1dCggRUxfTEFCRUwsIHByZXNldC5nZXRMYWJlbCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHBub2RlLnB1dCggRUxfREVTQ1JJUFRJT04sIHByZXNldC5nZXREZXNjcmlwdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogcHJlc2V0LmdldFByb2plY3RGYWNldHMoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VzIGZub2RlID0gcG5vZGUubm9kZSggU3RyaW5nLnZhbHVlT2YoIGNvdW50ZXIgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmbm9kZS5wdXQoIEFUVFJfSUQsIGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZub2RlLnB1dCggQVRUUl9WRVJTSU9OLCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIHJvb3QuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRVc2VyUHJlc2V0cygpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZXMgcm9vdCA9IGdldFVzZXJQcmVzZXRzUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBrZXlzID0gcm9vdC5jaGlsZHJlbk5hbWVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgcGtleXMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VzIHBub2RlID0gcm9vdC5ub2RlKCBwa2V5c1sgaSBdICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gcG5vZGUuZ2V0KCBFTF9MQUJFTCwgbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBsYWJlbCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHBub2RlLmdldCggRUxfREVTQ1JJUFRJT04sIG51bGwgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZGVzY3JpcHRpb24gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZrZXlzID0gcG5vZGUuY2hpbGRyZW5OYW1lcygpOwotICAgICAgICAgICAgICAgIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBma2V5cy5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlcyBmbm9kZSA9IHBub2RlLm5vZGUoIGZrZXlzWyBqIF0gKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gZm5vZGUuZ2V0KCBBVFRSX0lELCBudWxsICk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uID0gZm5vZGUuZ2V0KCBBVFRSX1ZFUlNJT04sIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBpZCA9PSBudWxsIHx8IHZlcnNpb24gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGlzUHJvamVjdEZhY2V0RGVmaW5lZCggaWQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGdldFByb2plY3RGYWNldCggaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGYuaGFzVmVyc2lvbiggdmVyc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNldHMuYWRkKCBmLmdldFZlcnNpb24oIHZlcnNpb24gKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWNldHMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggZmFjZXRzICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJlc2V0KCBsYWJlbCwgZGVzY3JpcHRpb24sIGZhY2V0cywgZmFsc2UgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldFVzZXJQcmVzZXRzUHJlZmVyZW5jZXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgSW5zdGFuY2VTY29wZSBzY29wZSA9IG5ldyBJbnN0YW5jZVNjb3BlKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHBsdWdpblJvb3QgCi0gICAgICAgICAgICA9IHNjb3BlLmdldE5vZGUoIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwbHVnaW5Sb290Lm5vZGUoICJ1c2VyLnByZXNldHMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJRmFjZXRlZFByb2plY3RUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGYWNldGVkUHJvamVjdFRlbXBsYXRlc0V4dGVuc2lvblBvaW50LmdldFRlbXBsYXRlcygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RlbXBsYXRlRGVmaW5lZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoIEZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQuZ2V0VGVtcGxhdGUoIGlkICkgIT0gbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSB0ZW1wbGF0ZSAKLSAgICAgICAgICAgID0gRmFjZXRlZFByb2plY3RUZW1wbGF0ZXNFeHRlbnNpb25Qb2ludC5nZXRUZW1wbGF0ZSggaWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0ZW1wbGF0ZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IE5MUy5iaW5kKCBSZXNvdXJjZXMudGVtcGxhdGVOb3REZWZpbmVkLCBpZCApOwotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggbXNnICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJR3JvdXA+IGdldEdyb3VwcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5ncm91cHMuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBEZWZpbmVkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLmNvbnRhaW5zS2V5KCBpZCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUdyb3VwIGdldEdyb3VwKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUdyb3VwIGdyb3VwID0gdGhpcy5ncm91cHMuZ2V0KCBpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGdyb3VwID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5ncm91cE5vdERlZmluZWQsIGlkICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGdyb3VwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElGYWNldGVkUHJvamVjdD4gZ2V0RmFjZXRlZFByb2plY3RzKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RmFjZXRlZFByb2plY3RzKCBudWxsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEZhY2V0ZWRQcm9qZWN0cyggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RmFjZXRlZFByb2plY3RzKCBmLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEZhY2V0ZWRQcm9qZWN0cyggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRGYWNldGVkUHJvamVjdHMoIG51bGwsIGZ2ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXQ8SUZhY2V0ZWRQcm9qZWN0PiBnZXRGYWNldGVkUHJvamVjdHMoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0W10gYWxsIAotICAgICAgICAgICAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SUZhY2V0ZWRQcm9qZWN0PiByZXN1bHQgPSBuZXcgSGFzaFNldDxJRmFjZXRlZFByb2plY3Q+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSBhbGxbIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiA9IGNyZWF0ZSggcHJvaiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZnByb2ogIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZiAhPSBudWxsICYmICEgZnByb2ouaGFzUHJvamVjdEZhY2V0KCBmICkgKSB8fAotICAgICAgICAgICAgICAgICAgICAoIGZ2ICE9IG51bGwgJiYgISBmcHJvai5oYXNQcm9qZWN0RmFjZXQoIGZ2ICkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggZnByb2ogKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBjcmVhdGVOZXdQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSggbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJgotICAgICAgICAgICAgcHJvamVjdC5pc05hdHVyZUVuYWJsZWQoIEZhY2V0ZWRQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCApICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRlZFByb2plY3QgZnByb2ogPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMucHJvamVjdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcm9qID0gdGhpcy5wcm9qZWN0cy5nZXQoIHByb2plY3QuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGZwcm9qID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnByb2ogPSBuZXcgRmFjZXRlZFByb2plY3QoIHByb2plY3QgKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0cy5wdXQoIHByb2plY3QuZ2V0TmFtZSgpLCBmcHJvaiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnByb2oucmVmcmVzaCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZnByb2o7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjb252ZXJ0SWZOZWNlc3NhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmCi0gICAgICAgICAgICAgICAgISBwcm9qZWN0LmlzTmF0dXJlRW5hYmxlZCggRmFjZXRlZFByb2plY3ROYXR1cmUuTkFUVVJFX0lEICkgJiYgCi0gICAgICAgICAgICAgICAgY29udmVydElmTmVjZXNzYXJ5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbIHByZXZOYXR1cmVzLmxlbmd0aCArIDEgXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoICk7Ci0gICAgICAgICAgICAgICAgbmV3TmF0dXJlc1sgcHJldk5hdHVyZXMubGVuZ3RoIF0gPSBGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQ7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKCBuZXdOYXR1cmVzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVFZGl0KCBwcm9qZWN0LmdldEZpbGUoIEZJTEVfRE9UX1BST0pFQ1QgKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oIGRlc2NyaXB0aW9uLCBzdWJtb24oIG1vbml0b3IsIDEgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZSggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggbmFtZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MKLSAgICAgICAgICAgICAgICA9IHdzLm5ld1Byb2plY3REZXNjcmlwdGlvbiggbmFtZSApOwotICAgIAotICAgICAgICAgICAgZGVzYy5zZXRMb2NhdGlvbiggbG9jYXRpb24gKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBwcm9qZWN0LmNyZWF0ZSggZGVzYywgc3VibW9uKCBtb25pdG9yLCAxICkgKTsKLSAgICAgICAgICAgIHByb2plY3Qub3Blbiggc3VibW9uKCBtb25pdG9yLCAxICkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhpcyBpcyBvZGQsIGJ1dCBhcHBhcmVudGx5IG5hdHVyZSdzIGNvbmZpZ3VyZSgpIG1ldGhvZCB3aWxsIG9ubHkKLSAgICAgICAgICAgIC8vIGJlIGNhbGxlZCBpZiB0aGUgc2V0RGVzY3JpcHRpb24oKSBtZXRob2QgaXMgdXNlZC4gSXQgd2lsbCBub3QgYmUKLSAgICAgICAgICAgIC8vIGNhbGxlZCBpZiBuYXR1cmUgaXMgYWRkZWQgdG8gdGhlIHByb2plY3QgZGVzY3JpcHRpb24gcHJpb3IgdG8KLSAgICAgICAgICAgIC8vIGNhbGxpbmcgSVByb2plY3QuY3JlYXRlKCkgbWV0aG9kLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBkZXNjLnNldE5hdHVyZUlkcyggbmV3IFN0cmluZ1tdIHsgRmFjZXRlZFByb2plY3ROYXR1cmUuTkFUVVJFX0lEIH0gKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oIGRlc2MsIG51bGwgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZSggcHJvamVjdCApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvamVjdExpc3RlbmVyUmVnaXN0cnkuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCB0eXBlcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5mcmFtZXdvcmtMaXN0ZW5lclJlZ2lzdHJ5LmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgdHlwZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvamVjdExpc3RlbmVyUmVnaXN0cnkucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICB0aGlzLmZyYW1ld29ya0xpc3RlbmVyUmVnaXN0cnkucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIFByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5IGdldFByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2plY3RMaXN0ZW5lclJlZ2lzdHJ5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyBjaGVjayggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8QWN0aW9uPiBhY3Rpb25zICkKLSAgICB7Ci0gICAgICAgIE11bHRpU3RhdHVzIHJlc3VsdCA9IENvbnN0cmFpbnQuY3JlYXRlTXVsdGlTdGF0dXMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCBvZiB0aGUgYWN0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgICAgICAKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuc3VwcG9ydHMoIGJhc2UsIGFjdGlvbi5nZXRUeXBlKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmFsaWRhdGlvblByb2JsZW0uVHlwZSBwdHlwZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggYWN0aW9uLmdldFR5cGUoKSA9PSBBY3Rpb24uVHlwZS5JTlNUQUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB0eXBlID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5JTlNUQUxMX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIGFjdGlvbi5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB0eXBlID0gVmFsaWRhdGlvblByb2JsZW0uVHlwZS5VTklOU1RBTExfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggYWN0aW9uLmdldFR5cGUoKSA9PSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdHlwZSA9IFZhbGlkYXRpb25Qcm9ibGVtLlR5cGUuVkVSU0lPTl9DSEFOR0VfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgVmFsaWRhdGlvblByb2JsZW0gdnAKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgVmFsaWRhdGlvblByb2JsZW0oIHB0eXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFByb2plY3RGYWNldCgpLmdldExhYmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCB2cCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBNdWx0aXBsZSBhY3Rpb25zIG9uIHRoZSBzYW1lIGZhY2V0IGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoZSBzYW1lCi0gICAgICAgIC8vIGJhdGNoLiBUaGUgb25seSBleGNlcHRpb24gaXMgYW4gdW5pbnN0YWxsIG9mIGEgcHJldmlvc2x5LWluc3RhbGxlZAotICAgICAgICAvLyB2ZXJzaW9uIGZvbGxvd2VkIGJ5IGFuIGluc3RhbGwgb2YgYSBuZXcgdmVyc2lvbi4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIE1hcDxJUHJvamVjdEZhY2V0LFNldDxBY3Rpb24+PiBmYWNldFRvQWN0aW9uc01hcCAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldCxTZXQ8QWN0aW9uPj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFByb2plY3RGYWNldCgpOwotICAgICAgICAgICAgU2V0PEFjdGlvbj4gZ3JvdXAgPSBmYWNldFRvQWN0aW9uc01hcC5nZXQoIGYgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGdyb3VwID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdyb3VwID0gbmV3IEhhc2hTZXQ8QWN0aW9uPigpOwotICAgICAgICAgICAgICAgIGZhY2V0VG9BY3Rpb25zTWFwLnB1dCggZiwgZ3JvdXAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ3JvdXAuYWRkKCBhY3Rpb24gKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBTZXQ8QWN0aW9uPiBncm91cCA6IGZhY2V0VG9BY3Rpb25zTWFwLnZhbHVlcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGdyb3VwLnNpemUoKSA+IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gYmFkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZ3JvdXAuc2l6ZSgpID09IDIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQWN0aW9uIGluc3RhbGwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBBY3Rpb24gdW5pbnN0YWxsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggQWN0aW9uIGFjdGlvbiA6IGdyb3VwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFjdGlvbi5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCA9IGFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGFjdGlvbi5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmluc3RhbGwgPSBhY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBpbnN0YWxsICE9IG51bGwgJiYgdW5pbnN0YWxsICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggYmFzZS5jb250YWlucyggdW5pbnN0YWxsLmdldFByb2plY3RGYWNldFZlcnNpb24oKSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggYmFkICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25Qcm9ibGVtLlR5cGUgcHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IFZhbGlkYXRpb25Qcm9ibGVtLlR5cGUuTVVMVElQTEVfQUNUSU9OU19OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCggbmV3IFZhbGlkYXRpb25Qcm9ibGVtKCBwdHlwZSApICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGZvciBhdHRlbXB0cyB0byB1bmluc3RhbGwgb3IgY2hhbmdlIHZlcnNpb24gb2YgZmFjZXRzIHRoYXQKLSAgICAgICAgLy8gaGF2ZW4ndCBiZWVuIGluc3RhbGxlZC4gQWxzbyBjaGVjayBmb3IgYXR0ZW1wdHMgdG8gaW5zdGFsbCBhIGZhY2V0Ci0gICAgICAgIC8vIHRoYXQncyBhbHJlYWR5IGluc3RhbGxlZC4KLSAgICAgICAgCi0gICAgICAgIGZvciggQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBmdi5nZXRQcm9qZWN0RmFjZXQoKTsKLQotICAgICAgICAgICAgVmFsaWRhdGlvblByb2JsZW0uVHlwZSBwdHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBhY3Rpb24uZ2V0VHlwZSgpID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgYmFzZS5jb250YWlucyggZnYgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdHlwZSA9IFZhbGlkYXRpb25Qcm9ibGVtLlR5cGUuQ0FOTk9UX1VOSU5TVEFMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZXhpc3RpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gdGVtcCA6IGJhc2UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRlbXAuZ2V0UHJvamVjdEZhY2V0KCkgPT0gZiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBhY3Rpb24uZ2V0VHlwZSgpID09IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICYmIGV4aXN0aW5nID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHR5cGUgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLkNBTk5PVF9DSEFOR0VfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggYWN0aW9uLmdldFR5cGUoKSA9PSBBY3Rpb24uVHlwZS5JTlNUQUxMICYmIGV4aXN0aW5nICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHR5cGUgPSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLkZBQ0VUX0FMUkVBRFlfSU5TVEFMTEVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHB0eXBlICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIG5ldyBWYWxpZGF0aW9uUHJvYmxlbSggcHR5cGUsIGYuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFib3J0IGF0IHRoaXMgcG9pbnQgaWYgdGhlcmUgYXJlIGFueSB2YWxpZGF0aW9uIHByb2JsZW1zLgotICAgICAgICAKLSAgICAgICAgaWYoICEgcmVzdWx0LmlzT0soKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFwcGx5IGFsbCB0aGUgdW5pbnN0YWxsIGFjdGlvbnMuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGFsbCA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggYmFzZSApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhY3Rpb24uZ2V0VHlwZSgpID09IEFjdGlvbi5UeXBlLlVOSU5TVEFMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBwbHkoIGFsbCwgYWN0aW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFwcGx5IGFsbCB0aGUgaW5zdGFsbCBhbmQgdmVyc2lvbiBjaGFuZ2UgYWN0aW9ucy4KLSAgICAgICAgCi0gICAgICAgIGZvciggQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggYWN0aW9uLmdldFR5cGUoKSAhPSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGx5KCBhbGwsIGFjdGlvbiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGUgY29uc3RyYWlucyBvbiBhbGwgb2YgdGhlIGZhY2V0cy4KLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBhbGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludCBjb25zdHJhaW50ID0gZnYuZ2V0Q29uc3RyYWludCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY29uc3RyYWludCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gY29uc3RyYWludC5jaGVjayggYWxsICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgc3QuaXNPSygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoIHN0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBFbGltaW5hdGUgc3ltbWV0cmljIGNvbmZsaWN0cyBwcm9ibGVtIGVudHJpZXMuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVN0YXR1cz4gcHJvYmxlbXMgPSBuZXcgSGFzaFNldDxJU3RhdHVzPigpOwotICAgICAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSByZXN1bHQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVN0YXR1cyBjaGlsZCA6IGNoaWxkcmVuICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvYmxlbXMuYWRkKCBjaGlsZCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8SVN0YXR1cz4gdG9yZW1vdmUgPSBuZXcgSGFzaFNldDxJU3RhdHVzPigpOwotCi0gICAgICAgIGZvciggSVN0YXR1cyBwcm9ibGVtIDogcHJvYmxlbXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISB0b3JlbW92ZS5jb250YWlucyggcHJvYmxlbSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSB2YWxwcm9iID0gKFZhbGlkYXRpb25Qcm9ibGVtKSBwcm9ibGVtOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB2YWxwcm9iLmdldFR5cGUoKSA9PSBWYWxpZGF0aW9uUHJvYmxlbS5UeXBlLkNPTkZMSUNUUyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBwID0gdmFscHJvYi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uUHJvYmxlbSByZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBWYWxpZGF0aW9uUHJvYmxlbSggVmFsaWRhdGlvblByb2JsZW0uVHlwZS5DT05GTElDVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgcFsgMSBdLCBwWyAwIF0gfSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdG9yZW1vdmUuYWRkKCByZXZlcnNlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggdG9yZW1vdmUuc2l6ZSgpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2JsZW1zLnJlbW92ZUFsbCggdG9yZW1vdmUgKTsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gcHJvYmxlbXMudG9BcnJheSggbmV3IElTdGF0dXNbIHByb2JsZW1zLnNpemUoKSBdICk7Ci0gICAgICAgICAgICByZXN1bHQgPSBDb25zdHJhaW50LmNyZWF0ZU11bHRpU3RhdHVzKCBjaGlsZHJlbiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBSZXR1cm4gdGhlIHByb2JsZW1zIHRvIHRoZSBjYWxsZXIuCi0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzb3J0KCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMgKQotICAgIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggY291bnQgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQmVmb3JlIHNvcnRpbmcsIGNoZWNrIHRoYXQgdGhlIGNvbnN0cmFpbnRzIGNhbiBiZSBtZXQuIE90aGVyd2lzZQotICAgICAgICAvLyB0aGUgc29ydCBhbGdvcml0aG0gd2lsbCBub3QgdGVybWluYXRlLgotICAgICAgICAKLSAgICAgICAgZmluYWwgSVN0YXR1cyBzdCA9IGNoZWNrKCBiYXNlLCBuZXcgSGFzaFNldDxBY3Rpb24+KCBhY3Rpb25zICkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIHN0LmlzT0soKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIHN0ICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEluaXRpYWxpemUgdHJhY2luZy4KLSAgICAgICAgCi0gICAgICAgIExpc3Q8QWN0aW9uPiB1bnNvcnRlZCA9IG51bGw7Ci0gICAgICAgIGludCBzdGVwcyA9IDA7Ci0gICAgICAgIAotICAgICAgICBpZiggRmFjZXRDb3JlUGx1Z2luLmlzVHJhY2luZ0FjdGlvblNvcnRpbmcoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc29ydGVkID0gbmV3IEFycmF5TGlzdDxBY3Rpb24+KCBhY3Rpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFN0ZXAgMSA6IFByZS1zb3J0IGFsbCB1bmluc3RhbGwgYWN0aW9ucyB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuIAotICAgICAgICAvLyAgICAgICAgICBXaXRoaW4gdGhhdCBvcmRlciwgc29ydCBhY3Rpb25zIGJhc2VkIG9uIGZhY2V0IGlkLiBUaGUKLSAgICAgICAgLy8gICAgICAgICAgc2Vjb25kYXJ5IHNvcnQgYXNzdXJlcyBhIHN0YWJsZSBzb3J0IG9yZGVyIGFtb25nIGFjdGlvbnMgb24KLSAgICAgICAgLy8gICAgICAgICAgdW5yZWxhdGVkIGZhY2V0cy4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENvbXBhcmF0b3I8QWN0aW9uPiBjb21wID0gbmV3IENvbXBhcmF0b3I8QWN0aW9uPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZSggZmluYWwgQWN0aW9uIGExLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aW9uIGEyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVzID0gY29tcGFyZSggYTEuZ2V0VHlwZSgpLCBhMi5nZXRUeXBlKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcmVzID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZDEgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IGExLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZDIgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IGEyLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gZmlkMS5jb21wYXJlVG8oIGZpZDIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZSggZmluYWwgQWN0aW9uLlR5cGUgdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0MiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHQxID09IHQyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB0MSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB0MiA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoIGFjdGlvbnMsIGNvbXAgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN0ZXAgMiA6IFNvcnQgYmFzZWQgb24gdGhlIGNvbnN0cmFpbnRzLgotICAgICAgICAKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmbmwgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oIGJhc2UgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBseSggZm5sLCBhY3Rpb24gKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBtYWtlQW5vdGhlclBhc3MgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgd2hpbGUoIG1ha2VBbm90aGVyUGFzcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ha2VBbm90aGVyUGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHN0YXRlID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCBiYXNlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY291bnQ7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uID0gYWN0aW9ucy5nZXQoIGkgKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlID0gYWN0aW9uLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGFjdGlvbi5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgY29uc3RyYWludCA9IGZ2LmdldENvbnN0cmFpbnQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgY29uc3RyYWludC5jaGVjayggc3RhdGUsIHRydWUgKS5pc09LKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQuY2hlY2soIGJhc2UsIHRydWUgKS5pc09LKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlVG9Gcm9udCggYWN0aW9ucywgaSApOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUFub3RoZXJQYXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5KCBzdGF0ZSwgYWN0aW9uICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvbnN0cmFpbnQuY2hlY2soIHN0YXRlICkuaXNPSygpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhICggISBjb25zdHJhaW50LmNoZWNrKCBzdGF0ZSwgdHJ1ZSApLmlzT0soKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQuY2hlY2soIGZubCwgdHJ1ZSApLmlzT0soKSApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkoIHN0YXRlLCBhY3Rpb24gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVUb0VuZCggYWN0aW9ucywgaSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gT3V0cHV0IHRyYWNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgIAotICAgICAgICBpZiggRmFjZXRDb3JlUGx1Z2luLmlzVHJhY2luZ0FjdGlvblNvcnRpbmcoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0Ci0gICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLnRyYWNpbmdBY3Rpb25Tb3J0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKCBiYXNlICksIHRvU3RyaW5nKCB1bnNvcnRlZCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKCBhY3Rpb25zICksIFN0cmluZy52YWx1ZU9mKCBzdGVwcyApICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggdGV4dCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGFwcGx5KCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aW9uIGFjdGlvbiApCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlID0gYWN0aW9uLmdldFR5cGUoKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotICAgICAgICAKLSAgICAgICAgaWYoIHR5cGUgPT0gQWN0aW9uLlR5cGUuSU5TVEFMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhY2V0cy5hZGQoIGZ2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBBY3Rpb24uVHlwZS5VTklOU1RBTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWNldHMucmVtb3ZlKCBmdiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIHggOiBmYWNldHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4LmdldFByb2plY3RGYWNldCgpID09IGZ2LmdldFByb2plY3RGYWNldCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY2V0cy5yZW1vdmUoIHggKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmYWNldHMuYWRkKCBmdiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRNaXNzaW5nRmFjZXQoIGZpbmFsIFN0cmluZyBmaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIGZhY2V0c1JlcG9ydGVkTWlzc2luZyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAhIGZhY2V0c1JlcG9ydGVkTWlzc2luZy5jb250YWlucyggZmlkICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhY2V0Tm90RGVmaW5lZCwgZmlkICkgKwotICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCBwbHVnaW4gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmYWNldHNSZXBvcnRlZE1pc3NpbmcuYWRkKCBmaWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRNaXNzaW5nRmFjZXQoIGZpbmFsIFN0cmluZyBmaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBmYWNldHNSZXBvcnRlZE1pc3NpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggISBmYWNldHNSZXBvcnRlZE1pc3NpbmcuY29udGFpbnMoIGZpZCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldE5vdERlZmluZWQsIGZpZCApICsKLSAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCggUmVzb3VyY2VzLnVzZWRJbkNvbnN0cmFpbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmYWNldHNSZXBvcnRlZE1pc3NpbmcuYWRkKCBmaWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwb3J0TWlzc2luZ1J1bnRpbWVDb21wb25lbnRUeXBlKCBmaW5hbCBTdHJpbmcgcmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW4gKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLnJ1bnRpbWVDb21wb25lbnRUeXBlTm90RGVmaW5lZCwgcmN0ICkgKwotICAgICAgICAgICAgICBOTFMuYmluZCggUmVzb3VyY2VzLnVzZWRJblBsdWdpbiwgcGx1Z2luICk7Ci0gICAgICAgIAotICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBzdWJtb24oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRpY2tzICkKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKCBtb25pdG9yLCB0aWNrcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbW92ZVRvRnJvbnQoIGZpbmFsIExpc3Q8QWN0aW9uPiBhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCApCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uID0gYWN0aW9ucy5nZXQoIGluZGV4ICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gaW5kZXg7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBhY3Rpb25zLnNldCggaSwgYWN0aW9ucy5nZXQoIGkgLSAxICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWN0aW9ucy5zZXQoIDAsIGFjdGlvbiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmVUb0VuZCggZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCApCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uID0gYWN0aW9ucy5nZXQoIGluZGV4ICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gaW5kZXggKyAxLCBuID0gYWN0aW9ucy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhY3Rpb25zLnNldCggaSAtIDEsIGFjdGlvbnMuZ2V0KCBpICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWN0aW9ucy5zZXQoIGFjdGlvbnMuc2l6ZSgpIC0gMSwgYWN0aW9uICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWFkTWV0YWRhdGEoKQotICAgIHsKLSAgICAgICAgZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElFeHRlbnNpb25Qb2ludCBwb2ludCAKLSAgICAgICAgICAgID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhURU5TSU9OX0lEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcG9pbnQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiRXh0ZW5zaW9uIHBvaW50IG5vdCBmb3VuZCEiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNmZ2VscyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBvaW50LmdldEV4dGVuc2lvbnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNmZ2VsIDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjZmdlbHMuYWRkKCBjZmdlbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgOiBjZmdlbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoIEVMX0NBVEVHT1JZICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZENhdGVnb3J5KCBjb25maWcgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQgaW4gdGhlIGxvZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfUFJPSkVDVF9GQUNFVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRQcm9qZWN0RmFjZXQoIGNvbmZpZyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCBpbiB0aGUgbG9nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTWFwPFByb2plY3RGYWNldFZlcnNpb24sSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBmdlRvQ29uc3RyYWludCAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8UHJvamVjdEZhY2V0VmVyc2lvbixJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBNYXA8UHJvamVjdEZhY2V0VmVyc2lvbixMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGZ2VG9BY3Rpb25zIAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxQcm9qZWN0RmFjZXRWZXJzaW9uLExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50Pj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfUFJPSkVDVF9GQUNFVF9WRVJTSU9OICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRQcm9qZWN0RmFjZXRWZXJzaW9uKCBjb25maWcsIGZ2VG9Db25zdHJhaW50LCBmdlRvQWN0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjYWxjdWxhdGVWZXJzaW9uQ29tcGFyaXNvblRhYmxlcyggZnZUb0NvbnN0cmFpbnQsIGZ2VG9BY3Rpb25zICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIE1hcC5FbnRyeTxQcm9qZWN0RmFjZXRWZXJzaW9uLElDb25maWd1cmF0aW9uRWxlbWVudD4geCA6IGZ2VG9Db25zdHJhaW50LmVudHJ5U2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFkQ29uc3RyYWludCggeC5nZXRWYWx1ZSgpLCB4LmdldEtleSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggTWFwLkVudHJ5PFByb2plY3RGYWNldFZlcnNpb24sTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PiB4IDogZnZUb0FjdGlvbnMuZW50cnlTZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldFZlcnNpb24gZnYgPSB4LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGFjdGlvbnMgPSB4LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGFjdGlvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRBY3Rpb24oIGNvbmZpZywgKFByb2plY3RGYWNldCkgZnYuZ2V0UHJvamVjdEZhY2V0KCksIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogY2ZnZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9BQ1RJT04gKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZEFjdGlvbiggY29uZmlnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfRVZFTlRfSEFORExFUiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRXZlbnRIYW5kbGVyKCBjb25maWcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogY2ZnZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9QUk9KRUNUX0ZBQ0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWREZWZhdWx0VmVyc2lvbkluZm8oIGNvbmZpZyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgOiBjZmdlbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29uZmlnLmdldE5hbWUoKS5lcXVhbHMoIEVMX0dST1VQICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZEdyb3VwKCBjb25maWcgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQgaW4gdGhlIGxvZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRDYXRlZ29yeSggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgCi0gICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnkoKTsKLSAgICAgICAgY2F0ZWdvcnkuc2V0SWQoIGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0lEICkgKTsKLSAgICAgICAgY2F0ZWdvcnkuc2V0UGx1Z2luSWQoIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbExhYmVsID0gZmluZE9wdGlvbmFsRWxlbWVudCggY29uZmlnLCBFTF9MQUJFTCApOwotICAgICAgICBjYXRlZ29yeS5zZXRMYWJlbCggZ2V0RWxlbWVudFZhbHVlKCBlbExhYmVsLCBjYXRlZ29yeS5nZXRJZCgpICkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbERlc2MgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBjb25maWcsIEVMX0RFU0NSSVBUSU9OICk7Ci0gICAgICAgIGNhdGVnb3J5LnNldERlc2NyaXB0aW9uKCBnZXRFbGVtZW50VmFsdWUoIGVsRGVzYywgREVGQVVMVF9ERVNDUklQVElPTiApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNhdGVnb3JpZXMuYWRkKCBjYXRlZ29yeS5nZXRJZCgpLCBjYXRlZ29yeSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVhZFByb2plY3RGYWNldCggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgCi0gICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYgPSBuZXcgUHJvamVjdEZhY2V0KCk7Ci0gICAgICAgIGYuc2V0SWQoIGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0lEICkgKTsKLSAgICAgICAgZi5zZXRQbHVnaW5JZCggY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxMYWJlbCA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfTEFCRUwgKTsKLSAgICAgICAgZi5zZXRMYWJlbCggZ2V0RWxlbWVudFZhbHVlKCBlbExhYmVsLCBmLmdldElkKCkgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsRGVzYyA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfREVTQ1JJUFRJT04gKTsKLSAgICAgICAgZi5zZXREZXNjcmlwdGlvbiggZ2V0RWxlbWVudFZhbHVlKCBlbERlc2MsIERFRkFVTFRfREVTQ1JJUFRJT04gKSApOwotCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbENvbXAgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBjb25maWcsIEVMX1ZFUlNJT05fQ09NUEFSQVRPUiApOwotICAgICAgICAKLSAgICAgICAgaWYoIGVsQ29tcCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZi5zZXRWZXJzaW9uQ29tcGFyYXRvciggZmluZFJlcXVpcmVkQXR0cmlidXRlKCBlbENvbXAsIEFUVFJfQ0xBU1MgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfUFJPUEVSVFkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfTkFNRSApOwotICAgIAotICAgICAgICAgICAgICAgIGlmKCBuYW1lID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfTkFNRSApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX1ZBTFVFICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHZhbHVlID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfVkFMVUUgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9iamVjdCBwYXJzZWRWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBuYW1lLmVxdWFscyggSVByb2plY3RGYWNldC5QUk9QX0hJREVfVkVSU0lPTiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oIHZhbHVlICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZi5zZXRQcm9wZXJ0eSggbmFtZSwgcGFyc2VkVmFsdWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGNhdG5hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsTWVtYmVyID0gZmluZE9wdGlvbmFsRWxlbWVudCggY29uZmlnLCBFTF9NRU1CRVIgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBlbE1lbWJlciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgY2F0bmFtZSA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggZWxNZW1iZXIsIEFUVFJfQ0FURUdPUlkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gIyMgREVQUkVDQVRFRCA6IDIuMCAjIwotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxDYXRlZ29yeSA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfQ0FURUdPUlkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGVsQ2F0ZWdvcnkgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2F0bmFtZSA9IGdldEVsZW1lbnRWYWx1ZSggZWxDYXRlZ29yeSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggY2F0bmFtZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGlzQ2F0ZWdvcnlEZWZpbmVkKCBjYXRuYW1lICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIENhdGVnb3J5IGNhdGVnb3J5ID0gKENhdGVnb3J5KSBnZXRDYXRlZ29yeSggY2F0bmFtZSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGYuc2V0Q2F0ZWdvcnkoIGNhdGVnb3J5ICk7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnkuYWRkUHJvamVjdEZhY2V0KCBmICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuY2F0ZWdvcnlOb3REZWZpbmVkLCBjYXRuYW1lICkgKwotICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5mYWNldHMuYWRkKCBmLmdldElkKCksIGYgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRQcm9qZWN0RmFjZXRWZXJzaW9uKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFByb2plY3RGYWNldFZlcnNpb24sSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBmdlRvQ29uc3RyYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxQcm9qZWN0RmFjZXRWZXJzaW9uLExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50Pj4gZnZUb0FjdGlvbnMgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfRkFDRVQgKTsKLQotICAgICAgICBpZiggZmlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfRkFDRVQgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHZlciA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotCi0gICAgICAgIGlmKCB2ZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFByb2plY3RGYWNldCBmID0gKFByb2plY3RGYWNldCkgdGhpcy5mYWNldHMuZ2V0KCBmaWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nRmFjZXQoIGZpZCwgY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFByb2plY3RGYWNldFZlcnNpb24gZnYKLSAgICAgICAgICAgID0gbmV3IFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGZ2LnNldFByb2plY3RGYWNldCggZiApOwotICAgICAgICBmdi5zZXRWZXJzaW9uU3RyaW5nKCB2ZXIgKTsKLSAgICAgICAgZnYuc2V0UGx1Z2luSWQoIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLSAgICAgICAgZnZUb0FjdGlvbnMucHV0KCBmdiwgYWN0aW9ucyApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0NPTlNUUkFJTlQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnZUb0NvbnN0cmFpbnQucHV0KCBmdiwgY2hpbGQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0dST1VQX01FTUJFUiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggaWQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9JRCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKSB0aGlzLmdyb3Vwcy5nZXQoIGlkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGdyb3VwID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBuZXcgR3JvdXAoKTsKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAuc2V0SWQoIGlkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3Vwcy5hZGQoIGlkLCBncm91cCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBncm91cC5hZGRNZW1iZXIoIGZ2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9BQ1RJT04gKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9ucy5hZGQoIGNoaWxkICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9QUk9QRVJUWSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9OQU1FICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYoIG5hbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9OQU1FICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkFMVUUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdmFsdWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9WQUxVRSApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZnYuc2V0UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGYuYWRkVmVyc2lvbiggZnYgKTsKLQotICAgICAgICAvLyBUaGlzIGhhcyB0byBoYXBwZW4gYWZ0ZXIgZmFjZXQgdmVyc2lvbiBpcyByZWdpc3RlcmVkLgotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRVZFTlRfSEFORExFUiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkRXZlbnRIYW5kbGVyKCBjaGlsZCwgZiwgdmVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJlLWNvbXB1dGVzIHRoZSB0YWJsZXMgdGhhdCBkZXNjcmliZSBob3cgdmVyc2lvbnMgb2YgYSBmYWNldCBjb21wYXJlCi0gICAgICogdG8gZWFjaCBvdGhlci4gVGhpcyBhbGxvd3MgdGhlIElQcm9qZWN0RmFjZXRWZXJzaW9uLmNvbXBhcmVUbygpIG9wZXJhdGlvbiwKLSAgICAgKiB3aGljaCBpcyBjYWxsZWQgcmF0aGVyIGZyZXF1ZW50bHksIHRvIGJlIHJlZHVjZWQgdG8gYSBoYXNoIHRhYmxlIGxvb2t1cAotICAgICAqIGluc3RlYWQgb2YgaGF2aW5nIHRvIGRvIGEgcGFyc2UgYW5kIGNvbXBhcmlzb24gb2YgdHdvIHZlcnNpb24gc3RyaW5ncy4KLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlVmVyc2lvbkNvbXBhcmlzb25UYWJsZXMoIGZpbmFsIE1hcDxQcm9qZWN0RmFjZXRWZXJzaW9uLElDb25maWd1cmF0aW9uRWxlbWVudD4gZnZUb0NvbnN0cmFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8UHJvamVjdEZhY2V0VmVyc2lvbixMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGZ2VG9BY3Rpb25zICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SVByb2plY3RGYWNldD4gYmFkRmFjZXRzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdEZhY2V0PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiB0aGlzLmZhY2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wID0gZi5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+IHZlcnNpb25zIAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+KCBmLmdldFZlcnNpb25zKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXA8SVByb2plY3RGYWNldFZlcnNpb24sTWFwPElQcm9qZWN0RmFjZXRWZXJzaW9uLEludGVnZXI+PiBjb21wVGFibGVzCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SVByb2plY3RGYWNldFZlcnNpb24sTWFwPElQcm9qZWN0RmFjZXRWZXJzaW9uLEludGVnZXI+PigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiB2ZXJzaW9ucyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21wVGFibGVzLnB1dCggZnYsIG5ldyBIYXNoTWFwPElQcm9qZWN0RmFjZXRWZXJzaW9uLEludGVnZXI+KCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSB2ZXJzaW9ucy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gaVZlciA9IHZlcnNpb25zLmdldCggaSApOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaVZlclN0ciA9IGlWZXIuZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8SVByb2plY3RGYWNldFZlcnNpb24sSW50ZWdlcj4gaUNvbXBUYWJsZSA9IGNvbXBUYWJsZXMuZ2V0KCBpVmVyICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gaSArIDE7IGogPCBuOyBqKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBqVmVyID0gdmVyc2lvbnMuZ2V0KCBqICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgalZlclN0ciA9IGpWZXIuZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPElQcm9qZWN0RmFjZXRWZXJzaW9uLEludGVnZXI+IGpDb21wVGFibGUgPSBjb21wVGFibGVzLmdldCggalZlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gY29tcC5jb21wYXJlKCBpVmVyU3RyLCBqVmVyU3RyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wVGFibGUucHV0KCBqVmVyLCBuZXcgSW50ZWdlciggcmVzdWx0ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpDb21wVGFibGUucHV0KCBpVmVyLCBuZXcgSW50ZWdlciggcmVzdWx0ICogLTEgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggTWFwLkVudHJ5PElQcm9qZWN0RmFjZXRWZXJzaW9uLE1hcDxJUHJvamVjdEZhY2V0VmVyc2lvbixJbnRlZ2VyPj4gZW50cnkKLSAgICAgICAgICAgICAgICAgICAgIDogY29tcFRhYmxlcy5lbnRyeVNldCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldFZlcnNpb24gZnYgPSAoUHJvamVjdEZhY2V0VmVyc2lvbikgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZ2LnNldENvbXBhcmlzb25UYWJsZSggZW50cnkuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGZhaWx1cmUgaGVyZSBpcyBkdWUgdG8gdGhlIHByb2JsZW0gbG9hZGluZyB0aGUgcHJvdmlkZWQKLSAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIGNvbXBhcmF0b3Igb3IgZHVlIHRvIHRoZSBwcm9ibGVtIGNvbXBhcmluZyB0aGUKLSAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIHN0cmluZy4gSW4gZWl0aGVyIGNhc2UsIHdlIGxvZyB0aGUgZXhjZXB0aW9uIGFuZAotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoaXMgZmFjZXQgZnJvbSB0aGUgc3lzdGVtIHRvIGtlZXAgYQotICAgICAgICAgICAgICAgIC8vIGZhdWx0eSBmYWNldCBmcm9tIGRyYWdnaW5nIGRvd24gdGhlIGVudGlyZSBmcmFtZXdvcmsuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgIGJhZEZhY2V0cy5hZGQoIGYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBiYWRGYWNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY2V0cy5yZW1vdmUoIGYgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnkpIGYuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNhdGVnb3J5ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhdGVnb3J5LnJlbW92ZVByb2plY3RGYWNldCggZiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdlRvQ29uc3RyYWludC5yZW1vdmUoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgZnZUb0FjdGlvbnMucmVtb3ZlKCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWFkRGVmYXVsdFZlcnNpb25JbmZvKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLQotICAgICAgICBpZiggaWQgPT0gbnVsbCB8fCAhIGlzUHJvamVjdEZhY2V0RGVmaW5lZCggaWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBlcnJvciBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQsIGRvbid0IG5lZWQgdG8gbG9nCi0gICAgICAgICAgICAvLyB0aGlzIGFnYWluLgotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFByb2plY3RGYWNldCBmID0gKFByb2plY3RGYWNldCkgZ2V0UHJvamVjdEZhY2V0KCBpZCApOwotICAgICAgICBib29sZWFuIGRlZmF1bHRWZXJzaW9uU3BlY2lmaWVkID0gZmFsc2U7Ci0KLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX0RFRkFVTFRfVkVSU0lPTiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xuYW1lID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX1BST1ZJREVSICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGNsbmFtZSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRGVmYXVsdFZlcnNpb25Qcm92aWRlciBkZWZhdWx0VmVyc2lvblByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnN0YW50aWF0ZSggZi5nZXRQbHVnaW5JZCgpLCBjbG5hbWUsIElEZWZhdWx0VmVyc2lvblByb3ZpZGVyLmNsYXNzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuc2V0RGVmYXVsdFZlcnNpb25Qcm92aWRlciggZGVmYXVsdFZlcnNpb25Qcm92aWRlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZlcnNpb25TcGVjaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24gPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHZlcnNpb24gIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmLmhhc1ZlcnNpb24oIHZlcnNpb24gKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXREZWZhdWx0VmVyc2lvbiggZi5nZXRWZXJzaW9uKCB2ZXJzaW9uICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmVyc2lvblNwZWNpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZi5jcmVhdGVWZXJzaW9uTm90Rm91bmRFcnJNc2coIHZlcnNpb24gKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoICEgZGVmYXVsdFZlcnNpb25TcGVjaWZpZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmLnNldERlZmF1bHRWZXJzaW9uKCBmLmdldExhdGVzdFZlcnNpb24oKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRBY3Rpb24oIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfRkFDRVQgKTsKLQotICAgICAgICBpZiggZmlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfRkFDRVQgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgUHJvamVjdEZhY2V0IGYgPSAoUHJvamVjdEZhY2V0KSB0aGlzLmZhY2V0cy5nZXQoIGZpZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIGYgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdGYWNldCggZmlkLCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlciA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotCi0gICAgICAgIGlmKCB2ZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlciA9IElWZXJzaW9uRXhwci5XSUxEQ0FSRF9TWU1CT0w7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlYWRBY3Rpb24oIGNvbmZpZywgZiwgdmVyICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRBY3Rpb24oIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldCBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIGZpbmFsIEFjdGlvbkRlZmluaXRpb24gZGVmID0gbmV3IEFjdGlvbkRlZmluaXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGRlZi5zZXRQbHVnaW5JZCggcGx1Z2luSWQgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyB0eXBlID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9UWVBFICk7Ci0gICAgICAgIAotICAgICAgICBpZiggdHlwZSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX1RZUEUgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb2YgZGVwcmVjYXRlZCBmdW5jdGlvbmFsaXR5LgotICAgICAgICAKLSAgICAgICAgaWYoIHR5cGUuZXF1YWxzKCAicnVudGltZS1jaGFuZ2VkIiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmRlcHJlY2F0ZWRSdW50aW1lQ2hhbmdlZEFjdGlvbiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ1dhcm5pbmcoIG1zZywgdHJ1ZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZWFkRXZlbnRIYW5kbGVyKCBjb25maWcsIGYsIHZlcnNpb24gKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBFbmQgb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY29kZS4KLSAgICAgICAgCi0gICAgICAgIGRlZi5zZXRBY3Rpb25UeXBlKCBBY3Rpb24uVHlwZS52YWx1ZU9mKCB0eXBlICkgKTsgCi0KLSAgICAgICAgaWYoIGRlZi5nZXRBY3Rpb25UeXBlKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuaW52YWxpZEFjdGlvblR5cGUsIHR5cGUgKSArCi0gICAgICAgICAgICAgICAgICBOTFMuYmluZCggUmVzb3VyY2VzLnVzZWRJblBsdWdpbiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRlZi5zZXRWZXJzaW9uRXhwciggbmV3IFZlcnNpb25FeHByPFByb2plY3RGYWNldFZlcnNpb24+KCBmLCB2ZXJzaW9uLCBwbHVnaW5JZCApICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gY29uZmlnLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW5bIGkgXTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9DT05GSUdfRkFDVE9SWSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xuYW1lID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGNsbmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX0NMQVNTICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVmLnNldENvbmZpZ0ZhY3RvcnlDbGFzc05hbWUoIGNsbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfREVMRUdBVEUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsbmFtZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjbG5hbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWYuc2V0RGVsZWdhdGVDbGFzc05hbWUoIGNsbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfUFJPUEVSVFkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfTkFNRSApOwotCi0gICAgICAgICAgICAgICAgaWYoIG5hbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9OQU1FICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkFMVUUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdmFsdWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9WQUxVRSApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9iamVjdCBwYXJzZWRWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBuYW1lLmVxdWFscyggSUFjdGlvbkRlZmluaXRpb24uUFJPUF9GUk9NX1ZFUlNJT05TICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gbmV3IFZlcnNpb25FeHByPFByb2plY3RGYWNldFZlcnNpb24+KCBmLCB2YWx1ZSwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmLnNldFByb3BlcnR5KCBuYW1lLCBwYXJzZWRWYWx1ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgaWQgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggaWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGYuZ2V0SWQoKSApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggJyMnICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCB2ZXJzaW9uICk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCAnIycgKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGRlZi5nZXRBY3Rpb25UeXBlKCkubmFtZSgpICk7Ci0KLSAgICAgICAgICAgIGZvciggTWFwLkVudHJ5PFN0cmluZyxPYmplY3Q+IGVudHJ5IDogZGVmLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnIycgKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBlbnRyeS5nZXRLZXkoKSApOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICc9JyApOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZCA9IGJ1Zi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkZWYuc2V0SWQoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggaXNBY3Rpb25EZWZpbmVkKCBpZCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5hY3Rpb25BbHJlYWR5RGVmaW5lZCwgaWQsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2dFcnJvciggbXNnICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmFjdGlvbnMuYWRkKCBkZWYuZ2V0SWQoKSwgZGVmICk7Ci0gICAgICAgICAgICBmLmFkZEFjdGlvbkRlZmluaXRpb24oIGRlZiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWFkRXZlbnRIYW5kbGVyKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmaWQgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0ZBQ0VUICk7Ci0KLSAgICAgICAgaWYoIGZpZCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0ZBQ0VUICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFByb2plY3RGYWNldCBmID0gKFByb2plY3RGYWNldCkgdGhpcy5mYWNldHMuZ2V0KCBmaWQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nRmFjZXQoIGZpZCwgY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXIgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLQotICAgICAgICBpZiggdmVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXIgPSBJVmVyc2lvbkV4cHIuV0lMRENBUkRfU1lNQk9MOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZWFkRXZlbnRIYW5kbGVyKCBjb25maWcsIGYsIHZlciApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTdXBwb3J0IGZvciBhIGRlcHJlY2F0ZWQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRFdmVudEhhbmRsZXIoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldCBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVFlQRSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHR5cGUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9UWVBFICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUgdDsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0eXBlLmVxdWFscyggInJ1bnRpbWUtY2hhbmdlZCIgKSB8fCB0eXBlLmVxdWFscyggIlJVTlRJTUVfQ0hBTkdFRCIgKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsKLSAgICAgICAgICAgIHQgPSBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSSU1BUllfUlVOVElNRV9DSEFOR0VEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdCA9IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUudmFsdWVPZiggdHlwZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggdCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5pbnZhbGlkRXZlbnRIYW5kbGVyVHlwZSwgdHlwZSApICsKLSAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHI7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdmV4cHIgPSBuZXcgVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4oIGYsIHZlcnNpb24sIHBsdWdpbklkICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGRlbGVnYXRlQ2xhc3NOYW1lID0gbnVsbDsKLQotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfREVMRUdBVEUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsbmFtZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjbG5hbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWxlZ2F0ZUNsYXNzTmFtZSA9IGNsbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIGRlbGVnYXRlQ2xhc3NOYW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nRWxlbWVudCggY29uZmlnLCBFTF9ERUxFR0FURSApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMZWdhY3lFdmVudEhhbmRsZXJBZGFwdGVyIGFkYXB0ZXIKLSAgICAgICAgICAgID0gbmV3IExlZ2FjeUV2ZW50SGFuZGxlckFkYXB0ZXIoIGYsIHZleHByLCBwbHVnaW5JZCwgZGVsZWdhdGVDbGFzc05hbWUgKTsKLSAgICAgICAgCi0gICAgICAgIGFkZExpc3RlbmVyKCBhZGFwdGVyLCB0ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWFkQ29uc3RyYWludCggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gb3BzID0gY29uZmlnLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZpbmFsIExpc3Q8SUNvbnN0cmFpbnQ+IHBhcnNlZCA9IG5ldyBBcnJheUxpc3Q8SUNvbnN0cmFpbnQ+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IG9wcy5sZW5ndGg7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50IG9wID0gcmVhZENvbnN0cmFpbnRIZWxwZXIoIG9wc1sgaiBdLCBmdiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggb3AgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFyc2VkLmFkZCggb3AgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIHBhcnNlZC5zaXplKCkgPT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZ2LnNldENvbnN0cmFpbnQoIHBhcnNlZC5nZXQoIDAgKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBhcnNlZC5zaXplKCkgPiAxICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQgYW5kIAotICAgICAgICAgICAgICAgID0gbmV3IENvbnN0cmFpbnQoIGZ2LCBJQ29uc3RyYWludC5UeXBlLkFORCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnRvQXJyYXkoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmdi5zZXRDb25zdHJhaW50KCBhbmQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElDb25zdHJhaW50IHJlYWRDb25zdHJhaW50SGVscGVyKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IHJvb3QuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uc3RyYWludC5UeXBlIHR5cGUKLSAgICAgICAgICAgID0gSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCByb290LmdldE5hbWUoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgT2JqZWN0W10gb3BlcmFuZHM7Ci0gICAgIAotICAgICAgICBpZiggdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLkFORCB8fAotICAgICAgICAgICAgdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSByb290LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBvcGVyYW5kcyA9IG5ldyBJQ29uc3RyYWludFsgY2hpbGRyZW4ubGVuZ3RoIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50IG9wZXJhbmQgCi0gICAgICAgICAgICAgICAgICAgID0gcmVhZENvbnN0cmFpbnRIZWxwZXIoIGNoaWxkcmVuWyBpIF0sIGZ2ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIG9wZXJhbmQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3BlcmFuZHNbIGkgXSA9IG9wZXJhbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTIHx8Ci0gICAgICAgICAgICAgICAgIHR5cGUgPT0gSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ2lkID0gcm9vdC5nZXRBdHRyaWJ1dGUoIEFUVFJfR1JPVVAgKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWQgPSByb290LmdldEF0dHJpYnV0ZSggQVRUUl9GQUNFVCApOwotICAgICAgICAgICAgU3RyaW5nIHZleHByc3RyID0gcm9vdC5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc29mdFN0ciA9IHJvb3QuZ2V0QXR0cmlidXRlKCBBVFRSX1NPRlQgKTsKLSAgICAgICAgICAgIEJvb2xlYW4gc29mdCA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzb2Z0U3RyICE9IG51bGwgJiYgc29mdFN0ci5lcXVhbHMoIEJvb2xlYW4uVFJVRS50b1N0cmluZygpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNvZnQgPSBCb29sZWFuLlRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBnaWQgIT0gbnVsbCAmJiAoIGZpZCAhPSBudWxsIHx8IHZleHByc3RyICE9IG51bGwgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgICAgID0gdHlwZSA9PSBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTCi0gICAgICAgICAgICAgICAgICAgICAgPyBSZXNvdXJjZXMuaW52YWxpZFJlcXVpcmVzQ29uc3RyYWludAotICAgICAgICAgICAgICAgICAgICAgIDogUmVzb3VyY2VzLmludmFsaWRDb25mbGljdHNDb25zdHJhaW50OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggdGVtcGxhdGUsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ0Vycm9yKCBtc2csIHRydWUgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGdpZCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISBpc0dyb3VwRGVmaW5lZCggZ2lkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmdyb3VwTm90RGVmaW5lZCwgZ2lkICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCggUmVzb3VyY2VzLnVzZWRJblBsdWdpbiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2dFcnJvciggbXNnLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBJR3JvdXAgZ3JvdXAgPSBnZXRHcm91cCggZ2lkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcGVyYW5kcyA9IG5ldyBPYmplY3RbXSB7IGdyb3VwLCBzb2Z0IH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzID0gbmV3IE9iamVjdFtdIHsgZ3JvdXAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWQgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgaXNQcm9qZWN0RmFjZXREZWZpbmVkKCBmaWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFjZXROb3REZWZpbmVkLCBmaWQgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBSZXNvdXJjZXMudXNlZEluUGx1Z2luLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ0Vycm9yKCBtc2csIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGdldFByb2plY3RGYWNldCggZmlkICk7Ci0KLSAgICAgICAgICAgICAgICBWZXJzaW9uRXhwciB2ZXhwciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHJzdHIgPT0gbnVsbCB8fCB2ZXhwcnN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZleHByc3RyID0gSVZlcnNpb25FeHByLldJTERDQVJEX1NZTUJPTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdmV4cHIgPSBuZXcgVmVyc2lvbkV4cHIoIGYsIHZleHByc3RyLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHMgPSBuZXcgT2JqZWN0W10geyBmLCB2ZXhwciwgc29mdCB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcGVyYW5kcyA9IG5ldyBPYmplY3RbXSB7IGYsIHZleHByIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLm1pc3NpbmdPbmVPZlR3b0F0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbklkLCByb290LmdldE5hbWUoKSwgQVRUUl9HUk9VUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9GQUNFVCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2dFcnJvciggbXNnLCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgQ29uc3RyYWludCggZnYsIHR5cGUsIG9wZXJhbmRzICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZWFkR3JvdXAoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIAotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0lEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggISBpc0dyb3VwRGVmaW5lZCggaWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgR3JvdXAgZ3JvdXAgPSAoR3JvdXApIGdldEdyb3VwKCBpZCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsTGFiZWwgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBjb25maWcsIEVMX0xBQkVMICk7Ci0gICAgICAgIGdyb3VwLnNldExhYmVsKCBnZXRFbGVtZW50VmFsdWUoIGVsTGFiZWwsIGdyb3VwLmdldElkKCkgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsRGVzYyA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGNvbmZpZywgRUxfREVTQ1JJUFRJT04gKTsKLSAgICAgICAgZ3JvdXAuc2V0RGVzY3JpcHRpb24oIGdldEVsZW1lbnRWYWx1ZSggZWxEZXNjLCBERUZBVUxUX0RFU0NSSVBUSU9OICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKCBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBPYmplY3Q+IGNvbGxlY3Rpb24gKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggT2JqZWN0IG9iaiA6IGNvbGxlY3Rpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggYnVmLmxlbmd0aCgpID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggIiwgIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBvYmogaW5zdGFuY2VvZiBJUHJvamVjdEZhY2V0VmVyc2lvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIG9iajsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggJyAnICk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggb2JqLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIHdzLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoIHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZCggZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLnRoaXMucHJvamVjdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciggSVJlc291cmNlRGVsdGEgc3ViZGVsdGEgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBqbmFtZSA9IHN1YmRlbHRhLmdldEZ1bGxQYXRoKCkuc2VnbWVudCggMCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLnRoaXMucHJvamVjdHMucmVtb3ZlKCBwam5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcGogIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKEZhY2V0ZWRQcm9qZWN0KSBmcGogKS5tYXJrRGVsZXRlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggRmFjZXRlZFByb2plY3QgZnByb2ogOiBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwudGhpcy5wcm9qZWN0cy52YWx1ZXMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2VEZWx0YSBzdWJkZWx0YSA9IGRlbHRhLmZpbmRNZW1iZXIoIGZwcm9qLmYuZ2V0RnVsbFBhdGgoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHN1YmRlbHRhICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJvai5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdPbmVPZlR3b0F0dHJpYnV0ZXM7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5Tm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFjZXROb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldFZlcnNpb25Ob3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Ob3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25BbHJlYWR5RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ3JvdXBOb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXROb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZU5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVDb21wb25lbnRUeXBlTm90RGVmaW5lZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlZEluUGx1Z2luOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VkSW5Db25zdHJhaW50OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkQWN0aW9uVHlwZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEV2ZW50SGFuZGxlclR5cGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRSZXF1aXJlc0NvbnN0cmFpbnQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRDb25mbGljdHNDb25zdHJhaW50OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZXByZWNhdGVkUnVudGltZUNoYW5nZWRBY3Rpb247Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYWNpbmdBY3Rpb25Tb3J0aW5nOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFjaW5nRnJhbWV3b3JrQWN0aXZhdGlvblN0YXJ0aW5nOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFjaW5nRnJhbWV3b3JrQWN0aXZhdGlvbkZpbmlzaGVkOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIHRlbXBsYXRlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczIH0gKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoIGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIHRlbXBsYXRlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0IH0gKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTU5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtJbXBsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1taXNzaW5nT25lT2ZUd29BdHRyaWJ1dGVzID0gRXh0ZW5zaW9uIGVsZW1lbnQgPHsxfT4gaW4gcGx1Z2luIHswfSByZXF1aXJlcyBlaXRoZXIgYXR0cmlidXRlIHsyfSBvciBhdHRyaWJ1dGUgezN9IHRvIGJlIHNwZWNpZmllZC4KLWNhdGVnb3J5Tm90RGVmaW5lZCA9IENhdGVnb3J5IHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLWZhY2V0Tm90RGVmaW5lZCA9IFByb2plY3QgZmFjZXQgezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLgotZmFjZXRWZXJzaW9uTm90RGVmaW5lZCA9IFZlcnNpb24gezF9IG9mIHByb2plY3QgZmFjZXQgezB9IGRvZXMgbm90IGV4aXN0LgotYWN0aW9uTm90RGVmaW5lZCA9IFByb2plY3QgZmFjZXQgYWN0aW9uIHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLWFjdGlvbkFscmVhZHlEZWZpbmVkID0gQXR0ZW1wdCB0byByZWRlZmluZSBwcm9qZWN0IGZhY2V0IGFjdGlvbiAiezB9IiBpbiBwbHVnaW4gezF9LgotZ3JvdXBOb3REZWZpbmVkID0gUHJvamVjdCBmYWNldCBncm91cCB7MH0gaGFzIG5vdCBiZWVuIGRlZmluZWQuCi1wcmVzZXROb3REZWZpbmVkID0gUHJlc2V0IHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLXRlbXBsYXRlTm90RGVmaW5lZCA9IFRlbXBsYXRlIHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLXJ1bnRpbWVDb21wb25lbnRUeXBlTm90RGVmaW5lZCA9IFJ1bnRpbWUgY29tcG9uZW50IHR5cGUgezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLgotdXNlZEluUGx1Z2luID0gXCBJdCBpcyB1c2VkIGluIHBsdWdpbiB7MH0uCi11c2VkSW5Db25zdHJhaW50ID0gXCBJdCBpcyB1c2VkIGluIHRoZSBjb25zdHJhaW50IG9mIHByb2plY3QgZmFjZXQgezB9IHZlcnNpb24gezF9LgotaW52YWxpZEFjdGlvblR5cGUgPSAiezB9IiBpcyBhbiBpbnZhbGlkIGFjdGlvbiB0eXBlLgotaW52YWxpZEV2ZW50SGFuZGxlclR5cGUgPSAiezB9IiBpcyBhbiBpbnZhbGlkIGV2ZW50IGhhbmRsZXIgdHlwZS4KLWludmFsaWRSZXF1aXJlc0NvbnN0cmFpbnQgPSBUaGUgcmVxdWlyZXMgY29uc3RyYWludCBjYW4gc3BlY2lmeSBlaXRoZXIgYSAiZ3JvdXAiIGF0dHJpYnV0ZSBvciBhICJmYWNldCIgYXR0cmlidXRlIGFuZCBhICJ2ZXJzaW9uIiBhdHRyaWJ1dGUuIFRoZSBwcm9ibGVtIHdhcyBmb3VuZCBpbiBwbHVnaW4gezB9LgotaW52YWxpZENvbmZsaWN0c0NvbnN0cmFpbnQgPSBUaGUgY29uZmxpY3RzIGNvbnN0cmFpbnQgY2FuIHNwZWNpZnkgZWl0aGVyIGEgImdyb3VwIiBhdHRyaWJ1dGUgb3IgYSAiZmFjZXQiIGF0dHJpYnV0ZSBhbmQgYSAidmVyc2lvbiIgYXR0cmlidXRlLiBUaGUgcHJvYmxlbSB3YXMgZm91bmQgaW4gcGx1Z2luIHswfS4KLQotZGVwcmVjYXRlZFJ1bnRpbWVDaGFuZ2VkQWN0aW9uID0gXAotVGhlIHByb2plY3QgZmFjZXQgYWN0aW9uICJydW50aW1lLWNoYW5nZWQiIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIEl0IGlzIHVzZWQgaW4gXAotcGx1Z2luIHswfS4gU2ltaWxhciBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSB2aWEgdGhlICJSVU5USU1FX0NIQU5HRUQiIFwKLWV2ZW50IGhhbmRsZXIuIFNlZSBleHRlbnNpb24gcG9pbnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIFwKLWZvciBtb3JlIGluZm9ybWF0aW9uLiAKLQotdHJhY2luZ0FjdGlvblNvcnRpbmcgPSBcCi1GaW5pc2hlZCBzb3J0aW5nIGZhY2V0ZWQgcHJvamVjdCBhY3Rpb25zLlxuXAotXCAgYmFzZSA9IHswfVxuXAotXCAgdW5zb3J0ZWQgPSB7MX1cblwKLVwgIHNvcnRlZCA9IHsyfVxuXAotXCAgc3RlcHMgPSB7M30gCi0KLXRyYWNpbmdGcmFtZXdvcmtBY3RpdmF0aW9uU3RhcnRpbmcgPSBcCi1BY3RpdmF0aW5nIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsuLi5cblwKLXswfQotCi10cmFjaW5nRnJhbWV3b3JrQWN0aXZhdGlvbkZpbmlzaGVkID0gXAotRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBhY3RpdmF0ZWQgc3VjY2Vzc2Z1bGx5IGluIHswfSBtcy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0TmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdE5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzVjNWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0TmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRlZFByb2plY3ROYXR1cmUKLQotICAgIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUKLQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9JRCAKLSAgICAgICAgPSBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5uYXR1cmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKCkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gdGhpcy5wcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29tbWFuZFtdIGV4aXN0aW5nID0gZGVzYy5nZXRCdWlsZFNwZWMoKTsKLSAgICAgICAgZmluYWwgSUNvbW1hbmRbXSBjbWRzID0gbmV3IElDb21tYW5kWyBleGlzdGluZy5sZW5ndGggKyAxIF07Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29tbWFuZCBuZXdjbWQgPSB0aGlzLnByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5uZXdDb21tYW5kKCk7Ci0gICAgICAgIG5ld2NtZC5zZXRCdWlsZGVyTmFtZSggRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlci5CVUlMREVSX0lEICk7Ci0gICAgICAgIAotICAgICAgICBjbWRzWyAwIF0gPSBuZXdjbWQ7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGV4aXN0aW5nLCAwLCBjbWRzLCAxLCBleGlzdGluZy5sZW5ndGggKTsKLSAgICAgICAgCi0gICAgICAgIGRlc2Muc2V0QnVpbGRTcGVjKCBjbWRzICk7Ci0gICAgICAgIHRoaXMucHJvamVjdC5zZXREZXNjcmlwdGlvbiggZGVzYywgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWNvbmZpZ3VyZSgpIHt9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWVlNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyCi0KLSAgICBleHRlbmRzIFByb3BlcnR5VGVzdGVyCi0gICAgCi17Ci0gICAgcHVibGljIGJvb2xlYW4gdGVzdCggZmluYWwgT2JqZWN0IHJlY2VpdmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHksIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgKCByZWNlaXZlciBpbnN0YW5jZW9mIElSZXNvdXJjZSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gKCAoSVJlc291cmNlKSByZWNlaXZlciApLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHBqID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHZhbHVlOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbG9uID0gdmFsLmluZGV4T2YoICc6JyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlkOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZleHByOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY29sb24gPT0gLTEgfHwgY29sb24gPT0gdmFsLmxlbmd0aCgpIC0gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlkID0gdmFsOwotICAgICAgICAgICAgICAgIHZleHByID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWQgPSB2YWwuc3Vic3RyaW5nKCAwLCBjb2xvbiApOwotICAgICAgICAgICAgICAgIHZleHByID0gdmFsLnN1YnN0cmluZyggY29sb24gKyAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQoIHBqLCBmaWQsIHZleHByICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmMTA4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUKLSAgICAKLXsKLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBmaXhlZDsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBmaXhlZFJlYWRPbmx5OwotICAgIHByaXZhdGUgSVByZXNldCBwcmVzZXQ7Ci0gICAgCi0gICAgRmFjZXRlZFByb2plY3RUZW1wbGF0ZSgpIAotICAgIHsKLSAgICAgICAgdGhpcy5maXhlZCA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHRoaXMuZml4ZWRSZWFkT25seSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggdGhpcy5maXhlZCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldElkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0TGFiZWwoIGZpbmFsIFN0cmluZyBsYWJlbCApCi0gICAgewotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0PiBnZXRGaXhlZFByb2plY3RGYWNldHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZml4ZWRSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhZGRGaXhlZFByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldCBmYWNldCApCi0gICAgewotICAgICAgICB0aGlzLmZpeGVkLmFkZCggZmFjZXQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByZXNldCBnZXRJbml0aWFsUHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByZXNldDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRJbml0aWFsUHJlc2V0KCBmaW5hbCBJUHJlc2V0IHByZXNldCApCi0gICAgewotICAgICAgICB0aGlzLnByZXNldCA9IHByZXNldDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNzYyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFRlbXBsYXRlc0V4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW4uUExVR0lOX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwucmVwb3J0TWlzc2luZ0ZhY2V0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZEV4dGVuc2lvbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kT3B0aW9uYWxFbGVtZW50OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZFJlcXVpcmVkQXR0cmlidXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZ2V0RWxlbWVudFZhbHVlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZ2V0VG9wTGV2ZWxFbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5JbmRleGVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5JbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgcHJvY2Vzc2luZyB0aGUgPGNvZGU+dGVtcGxhdGU8L2NvZGU+IGVsZW1lbnQgb2YgdGhlIDxjb2RlPmZhY2V0czwvY29kZT4gCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdFRlbXBsYXRlc0V4dGVuc2lvblBvaW50Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImZhY2V0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRklYRUQgPSAiZml4ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0xBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9QUkVTRVQgPSAicHJlc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9URU1QTEFURSA9ICJ0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJbmRleGVkU2V0PFN0cmluZyxJRmFjZXRlZFByb2plY3RUZW1wbGF0ZT4gdGVtcGxhdGVzID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJRmFjZXRlZFByb2plY3RUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCkKLSAgICB7Ci0gICAgICAgIHJlYWRFeHRlbnNpb25zKCk7Ci0gICAgICAgIHJldHVybiB0ZW1wbGF0ZXMuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZWFkRXh0ZW5zaW9ucygpOwotICAgICAgICByZXR1cm4gdGVtcGxhdGVzLmdldCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEV4dGVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgaWYoIHRlbXBsYXRlcyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0ZW1wbGF0ZXMgPSBuZXcgSW5kZXhlZFNldDxTdHJpbmcsSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU+KCk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgCi0gICAgICAgICAgICAgOiBnZXRUb3BMZXZlbEVsZW1lbnRzKCBmaW5kRXh0ZW5zaW9ucyggUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyggRUxfVEVNUExBVEUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkVGVtcGxhdGUoIGVsZW1lbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIgdmlhIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkVGVtcGxhdGUoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIAotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgdGVtcGxhdGUgPSBuZXcgRmFjZXRlZFByb2plY3RUZW1wbGF0ZSgpOwotICAgICAgICB0ZW1wbGF0ZS5zZXRJZCggZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsTGFiZWwgPSBmaW5kT3B0aW9uYWxFbGVtZW50KCBjb25maWcsIEVMX0xBQkVMICk7Ci0gICAgICAgIHRlbXBsYXRlLnNldExhYmVsKCBnZXRFbGVtZW50VmFsdWUoIGVsTGFiZWwsIHRlbXBsYXRlLmdldElkKCkgKSApOwotICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRklYRUQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY2hpbGQsIEFUVFJfRkFDRVQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoIGZpZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdGYWNldCggZmlkLCBwbHVnaW5JZCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRlbXBsYXRlLmFkZEZpeGVkUHJvamVjdEZhY2V0KCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGZpZCApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9QUkVTRVQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBpZCA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY2hpbGQsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoIHBpZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5wcmVzZXROb3REZWZpbmVkLCBwaWQsIHBsdWdpbklkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGVtcGxhdGUuc2V0SW5pdGlhbFByZXNldCggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KCBwaWQgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0ZW1wbGF0ZXMuYWRkKCB0ZW1wbGF0ZS5nZXRJZCgpLCB0ZW1wbGF0ZSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZXROb3REZWZpbmVkOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRmFjZXRlZFByb2plY3RUZW1wbGF0ZXNFeHRlbnNpb25Qb2ludC5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VGVtcGxhdGVzRXh0ZW5zaW9uUG9pbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4YmE4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFRlbXBsYXRlc0V4dGVuc2lvblBvaW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wcmVzZXROb3REZWZpbmVkID0gUHJlc2V0IHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4gSXQgaXMgdXNlZCBpbiBwbHVnaW4gezF9LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjViODEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VmFsaWRhdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kRXh0ZW5zaW9uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldFRvcExldmVsRWxlbWVudHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5pbnN0YW50aWF0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLnJlcG9ydE1pc3NpbmdBdHRyaWJ1dGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdFZhbGlkYXRpb25CdWlsZGVyCi0KLSAgICBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIKLSAgICAKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lECi0gICAgICAgID0gRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuYnVpbGRlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAidmFsaWRhdG9ycyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRkFDRVQgPSAiZmFjZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFZhbGlkYXRvckRlZmluaXRpb24+IHZhbGlkYXRvcnMgCi0gICAgICAgID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0b3JEZWZpbml0aW9uPigpOwotICAgIAotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgcmVhZEV4dGVuc2lvbnMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElQcm9qZWN0W10gYnVpbGQoIGZpbmFsIGludCBraW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwIGFyZ3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIFJlc291cmNlcy50YXNrRGVzY3JpcHRpb24sIDMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2ogKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRGVsZXRlIGV4aXN0aW5nIHByb2JsZW0gbWFya2Vycy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvai5kZWxldGVNYXJrZXJzKCBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuQkFTRV9NQVJLRVJfSUQsIHRydWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFBlcmZvcm0gYmFzaWMgdmFsaWRhdGlvbi4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdCA9IGZwcm9qLnZhbGlkYXRlKCBzdWJtb24oIG1vbml0b3IsIDEgKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBzdC5pc09LKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXNbXSBwcm9ibGVtcyA9IHN0LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm9ibGVtcy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIHByb2JsZW0gPSBwcm9ibGVtc1sgaSBdOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2V2ZXJpdHkgPSBwcm9ibGVtLmdldFNldmVyaXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcHJvYmxlbS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcm9qLmNyZWF0ZUVycm9yTWFya2VyKCBtZXNzYWdlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnByb2ouY3JlYXRlV2FybmluZ01hcmtlciggbWVzc2FnZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDYWxsIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggVmFsaWRhdG9yRGVmaW5pdGlvbiBkZWYgOiB2YWxpZGF0b3JzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZGVmLmlzQXBwbGljYWJsZSggZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yIHZhbGlkYXRvciA9IGRlZi5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB2YWxpZGF0b3IgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZSggZnByb2ogKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgd29ya2VkKCBtb25pdG9yLCAxICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBuZXcgSVByb2plY3RbMF07Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRFeHRlbnNpb25zKCkKLSAgICB7Ci0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyAKLSAgICAgICAgICAgIDogZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluZEV4dGVuc2lvbnMoIFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfVkFMSURBVE9SICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbGlkYXRvckRlZmluaXRpb24gZGVmID0gbmV3IFZhbGlkYXRvckRlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBkZWYucGx1Z2luID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRlZi5jbGFzc05hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0NMQVNTICk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZGVmLmNsYXNzTmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBqIF07Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRkFDRVQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3RGYWNldFJlZiByZWYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRSZWYucmVhZCggY2hpbGQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlZiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYuY29uc3RyYWludHMuYWRkKCByZWYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBkZWYgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLmFkZCggZGVmICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN1YlByb2dyZXNzTW9uaXRvciBzdWJtb24oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aWNrcyApCi0gICAgewotICAgICAgICBpZiggcGFyZW50ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKCBwYXJlbnQsIHRpY2tzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3b3JrZWQoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRpY2tzICkKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLndvcmtlZCggdGlja3MgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG1vbml0b3IuaXNDYW5jZWxlZCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWYWxpZGF0b3JEZWZpbml0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nIHBsdWdpbjsKLSAgICAgICAgcHVibGljIFN0cmluZyBjbGFzc05hbWU7Ci0gICAgICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IgdmFsaWRhdG9yOwotICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxQcm9qZWN0RmFjZXRSZWY+IGNvbnN0cmFpbnRzID0gbmV3IEFycmF5TGlzdDxQcm9qZWN0RmFjZXRSZWY+KCk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggUHJvamVjdEZhY2V0UmVmIHJlZiA6IHRoaXMuY29uc3RyYWludHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIHJlZi5jaGVjayggZmFjZXRzICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSUZhY2V0ZWRQcm9qZWN0VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gICAgICAgIAotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy52YWxpZGF0b3IgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IKLSAgICAgICAgICAgICAgICAgICAgPSBpbnN0YW50aWF0ZSggdGhpcy5wbHVnaW4sIHRoaXMuY2xhc3NOYW1lLCBJRmFjZXRlZFByb2plY3RWYWxpZGF0b3IuY2xhc3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0Rlc2NyaXB0aW9uOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggRmFjZXRlZFByb2plY3RWYWxpZGF0aW9uQnVpbGRlci5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VmFsaWRhdGlvbkJ1aWxkZXIucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0VmFsaWRhdGlvbkJ1aWxkZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1OTEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFZhbGlkYXRpb25CdWlsZGVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10YXNrRGVzY3JpcHRpb24gPSBWYWxpZGF0aW5nIGZhY2V0ZWQgcHJvamVjdC4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDljMDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0ZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQWN0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkRlZmF1bHRDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEeW5hbWljUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLk1pbmltYWxDb25maWd1cmF0aW9uUHJlc2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEZyYW1ld29ya0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLmludGVybmFsLlByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuSW5kZXhlZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlN0YXR1c1dyYXBwZXI7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkKLQotICAgIGltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IEVNUFRZX1NPUlRFRF9GVl9TRVQKLSAgICAgICAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQoIG5ldyBUcmVlU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpICk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG9iamVjdCB0aGF0J3MgdXNlZCBpbnRlcm5hbGx5IGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUuCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBPYmplY3QgbG9jazsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB0aGUgc2NlbmFyaW8gd2hlcmUgdGhlIHdvcmtpbmcgY29weSBpcyBmb3IgYQotICAgICAqIHByb2plY3QgdGhhdCBkb2Vzbid0IGV4aXN0IHlldCwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiB0aGUgcHJvamVjdCBuYW1lLiBJZiB0aGUgcHJvamVjdCBuYW1lIGlzIGFjY2VwdGFibGUsIHRoZSBzdGF0dXMKLSAgICAgKiBzZXZlcml0eSBpcyBnb2luZyB0byBiZSBJU3RhdHVzLk9LLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgSVN0YXR1cyBwcm9qZWN0TmFtZVZhbGlkYXRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9qZWN0IGluIHRoZSBzY2VuYXJpbyB3aGVyZSB0aGUgd29ya2luZyBjb3B5IGlzIGZvciBhCi0gICAgICogcHJvamVjdCB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0LCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBJUGF0aCBwcm9qZWN0TG9jYXRpb247Ci0gICAgcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFNldDxJUHJvamVjdEZhY2V0PiBmaXhlZEZhY2V0czsKLSAgICBwcml2YXRlIEluZGV4ZWRTZXQ8SVByb2plY3RGYWNldCxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzOwotICAgIHByaXZhdGUgTWFwPElQcm9qZWN0RmFjZXQsU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPj4gYXZhaWxhYmxlRmFjZXRzOwotICAgIHByaXZhdGUgSW5kZXhlZFNldDxTdHJpbmcsSVByZXNldD4gYXZhaWxhYmxlUHJlc2V0czsKLSAgICBwcml2YXRlIFN0cmluZyBzZWxlY3RlZFByZXNldElkOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElSdW50aW1lPiB0YXJnZXRhYmxlUnVudGltZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHRhcmdldGVkUnVudGltZXM7Ci0gICAgcHJpdmF0ZSBJUnVudGltZSBwcmltYXJ5UnVudGltZTsKLSAgICBwcml2YXRlIFNldDxBY3Rpb24+IGFjdGlvbnM7Ci0gICAgcHJpdmF0ZSBMaXN0PElTdGF0dXM+IHByb2JsZW1zOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxSdW5uYWJsZT4gZGlzcG9zZVRhc2tzOwotICAgIAotICAgIC8qKgotICAgICAqIE1hcHMgZXZlbnQgdHlwZXMgdG8gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRob3NlIGV2ZW50cy4gVGhlIG1hcCBpcwotICAgICAqIHBvcHVsYXRlZCB3aXRoIGVtcHR5IGxpc3RlbmVycyBsaXN0cyBmb3IgYWxsIGV2ZW50IHR5cGVzIGF0IGluaXRpYWxpemF0aW9uIGFuZCBpcyAKLSAgICAgKiBub3QgbW9kaWZpZWQgYWZ0ZXIgdGhhdC4gVGhlIGNvbnRhaW5lZCBsaXN0cyB1c2UgY29weS1vbi13cml0ZSBiZWhhdmlvciB0byBndWFyYW50ZWUgCi0gICAgICogZm9yIHNhZmUgaXRlcmF0aW9uIHdoZW4gbm90aWZ5aW5nIGxpc3RlbmVycy4KLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLExpc3Q8SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI+PiBsaXN0ZW5lcnM7Ci0KLSAgICAvKioKLSAgICAgKiBUcmFja3Mgd2hldGhlciBvciBub3QgZXZlbnQgbm90aWZpY2F0aW9uIGlzIGN1cnJlbnRseSBzdXNwZW5kZWQuIFRoaXMgY291bnRlciBpcwotICAgICAqIGluY3JlbWVudGVkIGJ5IHRoZSBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKSBtZXRob2QgYW5kIGRlY3JlbWVudGVkIGJ5IHRoZQotICAgICAqIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCkgbWV0aG9kLiBPbmNlIHRoZSBjb3VudGVyIHJlYWNoZXMgemVybywgYW55IHF1ZXVlZCBldmVudHMKLSAgICAgKiBjYW4gYmUgZGVsaXZlcmVkLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgaW50IHN1c3BlbmRFdmVudE5vdGljYXRpb25Db3VudGVyOwotICAgIAotICAgIC8qKgotICAgICAqIFRyYWNrcyB0aGUgZXZlbnRzIHRoYXQgYXJlIHF1ZXVlZCB3aGlsZSBldmVudCBub3RpZmljYXRpb24gaXMgc3VzcGVuZGVkLgotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4gcXVldWVkRXZlbnRzOwotICAgIAotICAgIHB1YmxpYyBGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICB0aGlzLmxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBudWxsOwotICAgICAgICB0aGlzLnByb2plY3ROYW1lVmFsaWRhdGlvbiA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRoaXMucHJvamVjdExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgdGhpcy5hY3Rpb25zID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgdGhpcy5wcm9ibGVtcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB0aGlzLmZpeGVkRmFjZXRzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgdGhpcy5mYWNldHMgPSBuZXcgSW5kZXhlZFNldDxJUHJvamVjdEZhY2V0LElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICB0aGlzLmF2YWlsYWJsZUZhY2V0cyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgICAgIHRoaXMuYXZhaWxhYmxlUHJlc2V0cyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJUHJlc2V0PigpOwotICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0SWQgPSBudWxsOwotICAgICAgICB0aGlzLnRhcmdldGFibGVSdW50aW1lcyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5U2V0PElSdW50aW1lPigpOwotICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMgPSBuZXcgQ29weU9uV3JpdGVBcnJheVNldDxJUnVudGltZT4oKTsKLSAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZGlzcG9zZVRhc2tzID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8SUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSxMaXN0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSBldmVudFR5cGUgOiBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLnZhbHVlcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHV0KCBldmVudFR5cGUsIG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxJRmFjZXRlZFByb2plY3RMaXN0ZW5lcj4oKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLnN1c3BlbmRFdmVudE5vdGljYXRpb25Db3VudGVyID0gMDsKLSAgICAgICAgdGhpcy5xdWV1ZWRFdmVudHMgPSBuZXcgQXJyYXlMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PigpOwotICAgICAgICAKLSAgICAgICAgcmVmcmVzaEF2YWlsYWJsZUZhY2V0cygpOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMucHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCB0aGlzLnByb2plY3QuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlZnJlc2hBdmFpbGFibGVQcmVzZXRzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5wcm9qZWN0ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXRQcm9qZWN0RmFjZXRzKCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlZnJlc2hUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnByb2plY3QgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFRhcmdldGVkUnVudGltZXMoIHRoaXMucHJvamVjdC5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkgKTsKLSAgICAgICAgICAgIHNldFByaW1hcnlSdW50aW1lKCB0aGlzLnByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gcmVnaXN0ZXJlZCBydW50aW1lcy4KLQotICAgICAgICBmaW5hbCBJTGlzdGVuZXIgcnVudGltZU1hbmFnZXJMaXN0ZW5lciA9IG5ldyBJTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFRocmVhZCBydW50aW1lc1JlZnJlc2hUaHJlYWQgPSBuZXcgVGhyZWFkKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbmRpbmcgZXZlbnQgbm90aWZpY2F0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbnRlcm5hbCBsaXN0IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXRhYmxlIHJ1bnRpbWVzIGlzIHVwZGF0ZWQgYmVmb3JlIHRoZSBBVkFJTEFCTEVfUlVOVElNRVNfQ0hBTkdFRAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgaXMgcmVjZWl2ZWQgYnkgbGlzdGVuZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS50aGlzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5BVkFJTEFCTEVfUlVOVElNRVNfQ0hBTkdFRCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggZXZlbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoVGFyZ2V0YWJsZVJ1bnRpbWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcnVudGltZXNSZWZyZXNoVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBSdW50aW1lTWFuYWdlci5hZGRSdW50aW1lTGlzdGVuZXIoIHJ1bnRpbWVNYW5hZ2VyTGlzdGVuZXIgKTsKLSAgICAgICAgCi0gICAgICAgIGFkZERpc3Bvc2VUYXNrCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVNYW5hZ2VyLnJlbW92ZVJ1bnRpbWVMaXN0ZW5lciggcnVudGltZU1hbmFnZXJMaXN0ZW5lciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExpc3RlbiBmb3IgY2hhbmdlcyB0byByZWdpc3RlcmVkIHByZXNldHMuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RGcmFtZXdvcmtMaXN0ZW5lciBwcmVzZXRzTGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVQcmVzZXRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lciggcHJlc2V0c0xpc3RlbmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUuUFJFU0VUX0FEREVELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEZyYW1ld29ya0V2ZW50LlR5cGUuUFJFU0VUX1JFTU9WRUQgKTsKLSAgICAgICAgCi0gICAgICAgIGFkZERpc3Bvc2VUYXNrCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKCBwcmVzZXRzTGlzdGVuZXIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHByb2plY3QuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciB0YXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZExpc3RlbmVyID0gbmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgYWRkTGlzdGVuZXIoIHRhcmdldGVkUnVudGltZXNDaGFuZ2VkTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnByb2plY3QgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2plY3ROYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHRoaXMucHJvamVjdCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIGVxdWFscyggdGhpcy5wcm9qZWN0TmFtZSwgbmFtZSApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggQWN0aW9uIGFjdGlvbiA6IGdldFByb2plY3RGYWNldEFjdGlvbnMoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZyA9IGFjdGlvbi5nZXRDb25maWcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29uZmlnICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFjdGlvbkNvbmZpZyBjID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb25maWcgaW5zdGFuY2VvZiBJQWN0aW9uQ29uZmlnICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChJQWN0aW9uQ29uZmlnKSBjb25maWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQWRhcHRlck1hbmFnZXIgbSA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdCA9IElBY3Rpb25Db25maWcuY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChJQWN0aW9uQ29uZmlnKSBtLmxvYWRBZGFwdGVyKCBjb25maWcsIHQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGMgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0UHJvamVjdE5hbWUoIHRoaXMucHJvamVjdE5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX05BTUVfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgdmFsaWRhdGVOYW1lUmVzdWx0ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gd3MudmFsaWRhdGVOYW1lKCB0aGlzLnByb2plY3ROYW1lLCBJUmVzb3VyY2UuUFJPSkVDVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISB0aGlzLnByb2plY3ROYW1lVmFsaWRhdGlvbi5lcXVhbHMoIHZhbGlkYXRlTmFtZVJlc3VsdCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3ROYW1lVmFsaWRhdGlvbiA9IHZhbGlkYXRlTmFtZVJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlZBTElEQVRJT05fUFJPQkxFTVNfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBUT0RPOiBuZWVkcyBtZXNzYWdlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVBhdGggZ2V0UHJvamVjdExvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMucHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2plY3RMb2NhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TG9jYXRpb24oIGZpbmFsIElQYXRoIGxvY2F0aW9uICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0ID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBUT0RPOiBuZWVkcyBtZXNzYWdlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gICAgewotICAgICAgICBpZiggdGhpcy5wcm9qZWN0ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRmFjZXRlZFByb2plY3QgZ2V0RmFjZXRlZFByb2plY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0PiBnZXRGaXhlZFByb2plY3RGYWNldHMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5maXhlZEZhY2V0czsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml4ZWRGYWNldHMuY29udGFpbnMoIGZhY2V0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB0aGlzLmZpeGVkRmFjZXRzLmVxdWFscyggZml4ZWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gbmV3RmFjZXRzIAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggZ2V0UHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBmaXhlZCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBjdXJyZW50VmVyc2lvbiA9IGdldFByb2plY3RGYWNldFZlcnNpb24oIGYgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjdXJyZW50VmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBmLmdldERlZmF1bHRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIGlzRmFjZXRBdmFpbGFibGUoIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2ID0gZ2V0SGlnaGVzdEF2YWlsYWJsZVZlcnNpb24oIGYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3RmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzZXRQcm9qZWN0RmFjZXRzKCBuZXdGYWNldHMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmZpeGVkRmFjZXRzIAotICAgICAgICAgICAgICAgICAgICA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldD4oIGZpeGVkICkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkZJWEVEX0ZBQ0VUU19DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZWZyZXNoQXZhaWxhYmxlRmFjZXRzKCk7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaEF2YWlsYWJsZVByZXNldHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1hcDxJUHJvamVjdEZhY2V0LFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4+IGdldEF2YWlsYWJsZUZhY2V0cygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUZhY2V0czsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY2V0QXZhaWxhYmxlKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVGYWNldHMuY29udGFpbnNLZXkoIGYgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY2V0QXZhaWxhYmxlKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gdmVyc2lvbnMgCi0gICAgICAgICAgICAgICAgPSB0aGlzLmF2YWlsYWJsZUZhY2V0cy5nZXQoIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAoIHZlcnNpb25zICE9IG51bGwgJiYgdmVyc2lvbnMuY29udGFpbnMoIGZ2ICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRBdmFpbGFibGVWZXJzaW9ucyggZmluYWwgSVByb2plY3RGYWNldCBmICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhdmFpbGFibGVWZXJzaW9ucyA9IHRoaXMuYXZhaWxhYmxlRmFjZXRzLmdldCggZiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggYXZhaWxhYmxlVmVyc2lvbnMgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlVmVyc2lvbnMgPSBFTVBUWV9TT1JURURfRlZfU0VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlVmVyc2lvbnM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldEhpZ2hlc3RBdmFpbGFibGVWZXJzaW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuYXZhaWxhYmxlRmFjZXRzLmdldCggZiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggdmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBmdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGZ2LmNvbXBhcmVUbyggdmVyc2lvbiApID4gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBmdjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hBdmFpbGFibGVGYWNldHMoKQotICAgIHsKLSAgICAgICAgZmluYWwgTWFwPElQcm9qZWN0RmFjZXQsU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPj4gbmV3QXZhaWxhYmxlRmFjZXRzCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPElQcm9qZWN0RmFjZXQsU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNldDxJUnVudGltZT4gdGFyZ2V0ZWRSdW50aW1lcyA9IGdldFRhcmdldGVkUnVudGltZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldCBmIDogUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgU29ydGVkU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXJzaW9ucyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmLmdldFZlcnNpb25zKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gYXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0ID09IG51bGwgfHwgISB0aGlzLnByb2plY3QuaGFzUHJvamVjdEZhY2V0KCBmdiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IHRhcmdldGVkUnVudGltZXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISByLnN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGF2YWlsYWJsZSAmJiAhIGZ2LmlzVmFsaWRGb3IoIHRoaXMuZml4ZWRGYWNldHMgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBhdmFpbGFibGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHZlcnNpb25zID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9IG5ldyBUcmVlU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXZhaWxhYmxlRmFjZXRzLnB1dCggZiwgdmVyc2lvbnMgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGFueSB1bmtub3duIGZhY2V0cyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBwcm9qZWN0LgotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMucHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMucHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmdi5nZXRQbHVnaW5JZCgpID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNvcnRlZFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gdmVyc2lvbnMgPSBuZXdBdmFpbGFibGVGYWNldHMuZ2V0KCBmICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdmVyc2lvbnMgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gbmV3IFRyZWVTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdBdmFpbGFibGVGYWNldHMucHV0KCBmLCB2ZXJzaW9ucyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucy5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSB0byB0aGUgYXZhaWxhYmxlIGZhY2V0cywgYXBwbHkgdGhlIGNoYW5nZSBhbmQgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0gICAgICAgIAotICAgICAgICBpZiggISB0aGlzLmF2YWlsYWJsZUZhY2V0cy5lcXVhbHMoIG5ld0F2YWlsYWJsZUZhY2V0cyApICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBNYXAuRW50cnk8SVByb2plY3RGYWNldCxTb3J0ZWRTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+PiBlbnRyeSAKLSAgICAgICAgICAgICAgICAgOiBuZXdBdmFpbGFibGVGYWNldHMuZW50cnlTZXQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldCggZW50cnkuZ2V0VmFsdWUoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRmFjZXRzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCBuZXdBdmFpbGFibGVGYWNldHMgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5BVkFJTEFCTEVfRkFDRVRTX0NIQU5HRUQgKSApOwotCi0gICAgICAgICAgICByZWZyZXNoQXZhaWxhYmxlUHJlc2V0cygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5nZXQoIGYgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5jb250YWluc0tleSggZiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5jb250YWlucyggZnYgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0RmFjZXRzKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW5kZXhlZFNldDxJUHJvamVjdEZhY2V0LElQcm9qZWN0RmFjZXRWZXJzaW9uPiBuZXdQcm9qZWN0RmFjZXRzCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IEluZGV4ZWRTZXQ8SVByb2plY3RGYWNldCxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZmFjZXRzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3RGYWNldHMuYWRkKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSwgZnYgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhZGRlZEZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gcmVtb3ZlZEZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gY2hhbmdlZFZlcnNpb25zID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IG5ld1Byb2plY3RGYWNldHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gY3VycmVudEZhY2V0VmVyc2lvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gdGhpcy5mYWNldHMuZ2V0KCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRGYWNldFZlcnNpb24gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkRmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIGZ2LmVxdWFscyggY3VycmVudEZhY2V0VmVyc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVmVyc2lvbnMuYWRkKCBmdiApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiB0aGlzLmZhY2V0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggISBuZXdQcm9qZWN0RmFjZXRzLmNvbnRhaW5zS2V5KCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEZhY2V0cy5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGFkZGVkRmFjZXRzLmlzRW1wdHkoKSAmJiByZW1vdmVkRmFjZXRzLmlzRW1wdHkoKSAmJiBjaGFuZ2VkVmVyc2lvbnMuaXNFbXB0eSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRQcmVzZXQoIG51bGwgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmZhY2V0cyA9IG5ld1Byb2plY3RGYWNldHM7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldHNDaGFuZ2VkRXZlbnQgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgUHJvamVjdEZhY2V0c0NoYW5nZWRFdmVudCggdGhpcywgYWRkZWRGYWNldHMsIHJlbW92ZWRGYWNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRWZXJzaW9ucyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggZXZlbnQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQgKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlZnJlc2hUYXJnZXRhYmxlUnVudGltZXMoKTsKLSAgICAgICAgICAgICAgICByZWZyZXNoUHJvamVjdEZhY2V0QWN0aW9ucygpOwotICAgICAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVQcmVzZXRzKCk7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybVZhbGlkYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkUHJvamVjdEZhY2V0KCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZXhpc3RpbmdWZXJzaW9uIAotICAgICAgICAgICAgICAgICAgICA9IHRoaXMuZmFjZXRzLmdldCggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZXhpc3RpbmdWZXJzaW9uID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBuZXdQcm9qZWN0RmFjZXRzIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3RGYWNldHMuYWRkQWxsKCB0aGlzLmZhY2V0cyApOwotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0RmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHNldFByb2plY3RGYWNldHMoIG5ld1Byb2plY3RGYWNldHMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZXhpc3RpbmdWZXJzaW9uID09IGZ2ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZHMgZXhjZXB0aW9uIG1zZwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9qZWN0RmFjZXQoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCBmICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGZ2ICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJvamVjdEZhY2V0KCBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCBmICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb2plY3RGYWNldCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGV4aXN0aW5nVmVyc2lvbiAKLSAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmZhY2V0cy5nZXQoIGZ2LmdldFByb2plY3RGYWNldCgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGV4aXN0aW5nVmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZXhpc3RpbmdWZXJzaW9uID09IGZ2ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gbmV3UHJvamVjdEZhY2V0cyAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0RmFjZXRzLmFkZEFsbCggdGhpcy5mYWNldHMgKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UHJvamVjdEZhY2V0cy5yZW1vdmUoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzZXRQcm9qZWN0RmFjZXRzKCBuZXdQcm9qZWN0RmFjZXRzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5lZWRzIGV4Y2VwdGlvbiBtc2cKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGFuZ2VQcm9qZWN0RmFjZXRWZXJzaW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZXhpc3RpbmdWZXJzaW9uIAotICAgICAgICAgICAgICAgICAgICA9IHRoaXMuZmFjZXRzLmdldCggZnYuZ2V0UHJvamVjdEZhY2V0KCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZXhpc3RpbmdWZXJzaW9uID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZHMgZXhjZXB0aW9uIG1zZwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIGV4aXN0aW5nVmVyc2lvbiA9PSBmdiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gbmV3UHJvamVjdEZhY2V0cyAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0RmFjZXRzLmFkZEFsbCggdGhpcy5mYWNldHMgKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UHJvamVjdEZhY2V0cy5yZW1vdmUoIGV4aXN0aW5nVmVyc2lvbiApOwotICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0RmFjZXRzLmFkZCggZnYgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHNldFByb2plY3RGYWNldHMoIG5ld1Byb2plY3RGYWNldHMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRCYXNlUHJvamVjdEZhY2V0cygpCi0gICAgewotICAgICAgICBpZiggdGhpcy5wcm9qZWN0ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SVByZXNldD4gZ2V0QXZhaWxhYmxlUHJlc2V0cygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZVByZXNldHMuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hBdmFpbGFibGVQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxJUHJlc2V0PiBuZXdBdmFpbGFibGVQcmVzZXRzID0gbmV3IEluZGV4ZWRTZXQ8U3RyaW5nLElQcmVzZXQ+KCk7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSVByZXNldCBwcmVzZXQgOiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHByZXNldC5nZXRUeXBlKCkgPT0gSVByZXNldC5UeXBlLkRZTkFNSUMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY29udGV4dCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnB1dCggSUR5bmFtaWNQcmVzZXQuQ09OVEVYVF9LRVlfRkFDRVRFRF9QUk9KRUNULCB0aGlzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wdXQoIElEeW5hbWljUHJlc2V0LkNPTlRFWFRfS0VZX1BSSU1BUllfUlVOVElNRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWFyeVJ1bnRpbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnB1dCggSUR5bmFtaWNQcmVzZXQuQ09OVEVYVF9LRVlfRklYRURfRkFDRVRTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXhlZEZhY2V0cyApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXQgPSAoIChJRHluYW1pY1ByZXNldCkgcHJlc2V0ICkucmVzb2x2ZSggY29udGV4dCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcHJlc2V0ID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXBwbGljYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgb2YgdGhlIGZhY2V0cyBsaXN0ZWQgaW4gdGhlIHByZXNldCBhbmQgdGhlaXIgdmVyc2lvbnMgbXVzdCBiZSBhdmFpbGFibGUuCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZmFjZXRzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgaXNGYWNldEF2YWlsYWJsZSggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJlc2V0IG11c3Qgc3BhbiBhY3Jvc3MgYWxsIG9mIHRoZSBmaXhlZCBmYWNldHMuCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IHRoaXMuZml4ZWRGYWNldHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGYuZ2V0VmVyc2lvbnMoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZhY2V0cy5jb250YWlucyggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgZm91bmQgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGFwcGxpY2FibGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdBdmFpbGFibGVQcmVzZXRzLmFkZCggcHJlc2V0LmdldElkKCksIHByZXNldCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5lcXVhbHMoIG5ld0F2YWlsYWJsZVByZXNldHMgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZVByZXNldHMgPSBuZXdBdmFpbGFibGVQcmVzZXRzOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLkFWQUlMQUJMRV9QUkVTRVRTX0NIQU5HRUQgKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuc2VsZWN0ZWRQcmVzZXRJZCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgISB0aGlzLmF2YWlsYWJsZVByZXNldHMuY29udGFpbnNLZXkoIHRoaXMuc2VsZWN0ZWRQcmVzZXRJZCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRQcmVzZXQoIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcmVzZXQgZ2V0U2VsZWN0ZWRQcmVzZXQoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5zZWxlY3RlZFByZXNldElkICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZVByZXNldHMuZ2V0KCB0aGlzLnNlbGVjdGVkUHJlc2V0SWQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFByZXNldCggZmluYWwgU3RyaW5nIHByZXNldElkICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcHJlc2V0SWQgIT0gbnVsbCAmJiAhIHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5jb250YWluc0tleSggcHJlc2V0SWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5jb3VsZE5vdFNlbGVjdFByZXNldCwgcHJlc2V0SWQgKTsgCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG1zZyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBlcXVhbHMoIHRoaXMuc2VsZWN0ZWRQcmVzZXRJZCwgcHJlc2V0SWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IHRoaXMuYXZhaWxhYmxlUHJlc2V0cy5nZXQoIHByZXNldElkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggcHJlc2V0ICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUga2VlcHMgdGhlIHNldFByb2plY3RGYWNldHMoKSBjYWxsIHRoYXQgY29tZXMgbmV4dCBmcm9tIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyBhIHByZXNldCBjaGFuZ2UgZXZlbnQgZnJvbSBiZWluZyBnZW5lcmF0ZWQuIFdlIHdhbnQgdG8gYXZvaWQgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJpbmcgdHdvIHByZXNldCBjaGFuZ2UgZXZlbnRzIHdoaWxlIHByZXNlbnRpbmcgYSBjb25zaXN0ZW50IGRhdGEgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3R1cmUgKHRoZSBvbGQgcHJlc2V0IGlzbid0IHNlbGVjdGVkKSB0byBldmVudCBoYW5kbGVycyBsaXN0ZW5pbmcgb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmFjZXQgY2hhbmdlIGV2ZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0SWQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9qZWN0RmFjZXRzKCBwcmVzZXQuZ2V0UHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXRJZCA9IHByZXNldElkOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5TRUxFQ1RFRF9QUkVTRVRfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByZXNldCBnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZVByZXNldHMuZ2V0KCBEZWZhdWx0Q29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuUFJFU0VUX0lEICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByZXNldCBnZXRNaW5pbWFsQ29uZmlndXJhdGlvbigpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZVByZXNldHMuZ2V0KCBNaW5pbWFsQ29uZmlndXJhdGlvblByZXNldEZhY3RvcnkuUFJFU0VUX0lEICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PElSdW50aW1lPiBnZXRUYXJnZXRhYmxlUnVudGltZXMoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRhYmxlUnVudGltZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNUYXJnZXRhYmxlKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzLmNvbnRhaW5zKCBydW50aW1lICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaFRhcmdldGFibGVSdW50aW1lcygpCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU2V0PElSdW50aW1lPiByZXN1bHQgPSBuZXcgSGFzaFNldDxJUnVudGltZT4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHIgOiBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb2s7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0ICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLmNvbnRhaW5zKCByICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiB0aGlzLmZhY2V0cyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgci5zdXBwb3J0cyggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBvayApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIHIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISB0aGlzLnRhcmdldGFibGVSdW50aW1lcy5lcXVhbHMoIHJlc3VsdCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzLmFkZEFsbCggcmVzdWx0ICk7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVEFSR0VUQUJMRV9SVU5USU1FU19DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8SVJ1bnRpbWU+IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxJUnVudGltZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IHRoaXMudGFyZ2V0ZWRSdW50aW1lcyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzLmNvbnRhaW5zKCByICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFkZCggciApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMucmVtb3ZlQWxsKCB0b1JlbW92ZSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgdG9SZW1vdmUuaXNFbXB0eSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5UQVJHRVRFRF9SVU5USU1FU19DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVGYWNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMucHJpbWFyeVJ1bnRpbWUgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIHRoaXMudGFyZ2V0YWJsZVJ1bnRpbWVzLmNvbnRhaW5zKCB0aGlzLnByaW1hcnlSdW50aW1lICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Bc3NpZ25QcmltYXJ5UnVudGltZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElSdW50aW1lPiBnZXRUYXJnZXRlZFJ1bnRpbWVzKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0ZWRSdW50aW1lczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RhcmdldGVkKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5jb250YWlucyggcnVudGltZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldGVkUnVudGltZXMoIGZpbmFsIFNldDxJUnVudGltZT4gcnVudGltZXMgKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5lcXVhbHMoIHJ1bnRpbWVzICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHIgOiBydW50aW1lcyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLnRhcmdldGFibGVSdW50aW1lcy5jb250YWlucyggciApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMuYWRkKCByICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9NT0RJRklFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hBdmFpbGFibGVGYWNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLnByaW1hcnlSdW50aW1lID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICEgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLmNvbnRhaW5zKCB0aGlzLnByaW1hcnlSdW50aW1lICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvQXNzaWduUHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVGFyZ2V0ZWRSdW50aW1lKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldGVkUnVudGltZXMuYWRkKCBydW50aW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQgKSApOwotICAgICAgICAgICAgICAgICAgICByZWZyZXNoQXZhaWxhYmxlRmFjZXRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5wcmltYXJ5UnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IHJ1bnRpbWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEF2YWlsYWJsZVByZXNldHMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVEICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhcmdldGVkUnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHJ1bnRpbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5yZW1vdmUoIHJ1bnRpbWUgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQXZhaWxhYmxlRmFjZXRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBydW50aW1lLmVxdWFscyggdGhpcy5wcmltYXJ5UnVudGltZSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvQXNzaWduUHJpbWFyeVJ1bnRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElSdW50aW1lIGdldFByaW1hcnlSdW50aW1lKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeVJ1bnRpbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeVJ1bnRpbWUoIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgKQotICAgIHsKLSAgICAgICAgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIGVxdWFscyggdGhpcy5wcmltYXJ5UnVudGltZSwgcnVudGltZSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBydW50aW1lID09IG51bGwgJiYgdGhpcy50YXJnZXRlZFJ1bnRpbWVzLnNpemUoKSA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLnRhcmdldGVkUnVudGltZXMuY29udGFpbnMoIHJ1bnRpbWUgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWFyeVJ1bnRpbWUgPSBydW50aW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIG5ldyBGYWNldGVkUHJvamVjdEV2ZW50KCB0aGlzLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSSU1BUllfUlVOVElNRV9DSEFOR0VEICkgKTsKLSAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEF2YWlsYWJsZVByZXNldHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhdXRvQXNzaWduUHJpbWFyeVJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByaW1hcnlSdW50aW1lID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFBpY2sgb25lIHRvIGJlIHRoZSBwcmltYXJ5LiBObyBzcGVjaWFsIHNlbWFudGljcyBhcyB0byB3aGljaCAKLSAgICAgICAgICAgIC8vIG9uZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5wcmltYXJ5UnVudGltZSA9IHRoaXMudGFyZ2V0ZWRSdW50aW1lcy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5vdGlmeUxpc3RlbmVycyggbmV3IEZhY2V0ZWRQcm9qZWN0RXZlbnQoIHRoaXMsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQgKSApOwotICAgICAgICByZWZyZXNoQXZhaWxhYmxlUHJlc2V0cygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PEFjdGlvbj4gZ2V0UHJvamVjdEZhY2V0QWN0aW9ucygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFjdGlvbiBnZXRQcm9qZWN0RmFjZXRBY3Rpb24oIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCB0aGlzLmFjdGlvbnMsIG51bGwsIGZhY2V0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQWN0aW9uIGdldFByb2plY3RGYWNldEFjdGlvbiggZmluYWwgU2V0PEFjdGlvbj4gYWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGZvciggQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCB0eXBlID09IG51bGwgfHwgYWN0aW9uLmdldFR5cGUoKSA9PSB0eXBlICkgJiYgCi0gICAgICAgICAgICAgICAgYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKSA9PSBmdiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEFjdGlvbiBnZXRQcm9qZWN0RmFjZXRBY3Rpb24oIGZpbmFsIFNldDxBY3Rpb24+IGFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aW9uLlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgKQotICAgIHsKLSAgICAgICAgZm9yKCBBY3Rpb24gYWN0aW9uIDogYWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIHR5cGUgPT0gbnVsbCB8fCBhY3Rpb24uZ2V0VHlwZSgpID09IHR5cGUgKSAmJiAKLSAgICAgICAgICAgICAgICBhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFByb2plY3RGYWNldCgpID09IGYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEFjdGlvbiBjcmVhdGVQcm9qZWN0RmFjZXRBY3Rpb24oIGZpbmFsIFNldDxBY3Rpb24+IGFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGdldFByb2plY3RGYWNldEFjdGlvbiggYWN0aW9ucywgdHlwZSwgZnYgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBhY3Rpb24gPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSA9IGdldEJhc2VQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9iamVjdCBjb25maWcgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZnYuc3VwcG9ydHMoIGJhc2UsIHR5cGUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBmdi5nZXRQcm9qZWN0RmFjZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IGdldFByb2plY3RGYWNldEFjdGlvbiggYWN0aW9ucywgdHlwZSwgZiApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGFjdGlvbiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZ2LnN1cHBvcnRzKCBiYXNlLCB0eXBlICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnN1cHBvcnRzKCBiYXNlLCB0eXBlICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdi5nZXRBY3Rpb25EZWZpbml0aW9uKCBiYXNlLCB0eXBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IGN1cnJlbnQuZ2V0QWN0aW9uRGVmaW5pdGlvbiggYmFzZSwgdHlwZSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBhY3Rpb24uZ2V0Q29uZmlnKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjb25maWcgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElBY3Rpb25EZWZpbml0aW9uIGRlZiA9IGZ2LmdldEFjdGlvbkRlZmluaXRpb24oIGJhc2UsIHR5cGUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGRlZi5jcmVhdGVDb25maWdPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYmluZFByb2plY3RGYWNldEFjdGlvbkNvbmZpZyggZnYsIGNvbmZpZyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIHR5cGUsIGZ2LCBjb25maWcgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmRQcm9qZWN0RmFjZXRBY3Rpb25Db25maWcoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYWN0aW9uQ29uZmlnICkKLSAgICB7Ci0gICAgICAgIGlmKCBhY3Rpb25Db25maWcgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElBY3Rpb25Db25maWcgYzEgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggYWN0aW9uQ29uZmlnIGluc3RhbmNlb2YgSUFjdGlvbkNvbmZpZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYzEgPSAoSUFjdGlvbkNvbmZpZykgYWN0aW9uQ29uZmlnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggYWN0aW9uQ29uZmlnICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElBZGFwdGVyTWFuYWdlciBtIAotICAgICAgICAgICAgICAgICAgICA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHQKLSAgICAgICAgICAgICAgICAgICAgPSBJQWN0aW9uQ29uZmlnLmNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjMSA9IChJQWN0aW9uQ29uZmlnKSBtLmxvYWRBZGFwdGVyKCBhY3Rpb25Db25maWcsIHQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGMxICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMxLnNldFByb2plY3ROYW1lKCBnZXRQcm9qZWN0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgYzEuc2V0VmVyc2lvbiggZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQWN0aW9uQ29uZmlnIGMyID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGFjdGlvbkNvbmZpZyBpbnN0YW5jZW9mIEFjdGlvbkNvbmZpZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYzIgPSAoQWN0aW9uQ29uZmlnKSBhY3Rpb25Db25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBhY3Rpb25Db25maWcgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUFkYXB0ZXJNYW5hZ2VyIG0gPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ID0gQWN0aW9uQ29uZmlnLmNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBjMiA9IChBY3Rpb25Db25maWcpIG0ubG9hZEFkYXB0ZXIoIGFjdGlvbkNvbmZpZywgdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggYzIgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYzIuc2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSggdGhpcyApOwotICAgICAgICAgICAgICAgIGMyLnNldFByb2plY3RGYWNldFZlcnNpb24oIGZ2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hQcm9qZWN0RmFjZXRBY3Rpb25zKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSA9IGdldEJhc2VQcm9qZWN0RmFjZXRzKCk7Ci0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gc2VsID0gZ2V0UHJvamVjdEZhY2V0cygpOwotICAgICAgICBmaW5hbCBTZXQ8QWN0aW9uPiBvbGQgPSBuZXcgSGFzaFNldDxBY3Rpb24+KCB0aGlzLmFjdGlvbnMgKTsKLSAgICAgICAgZmluYWwgU2V0PEFjdGlvbj4gbmV3QWN0aW9ucyA9IG5ldyBIYXNoU2V0PEFjdGlvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdoYXQgaGFzIGJlZW4gcmVtb3ZlZD8KLSAgICAgICAgCi0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBiYXNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgc2VsLmNvbnRhaW5zKCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdBY3Rpb25zLmFkZCggY3JlYXRlUHJvamVjdEZhY2V0QWN0aW9uKCBvbGQsIEFjdGlvbi5UeXBlLlVOSU5TVEFMTCwgZnYgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2hhdCBoYXMgYmVlbiBhZGRlZD8KLQotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogc2VsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgYmFzZS5jb250YWlucyggZnYgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3QWN0aW9ucy5hZGQoIGNyZWF0ZVByb2plY3RGYWNldEFjdGlvbiggb2xkLCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmdiApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENvYWxlc2NlIHVuaW5zdGFsbC9pbnN0YWxsIHBhaXJzIGludG8gdmVyc2lvbiBjaGFuZ2UgYWN0aW9ucywgaWYKLSAgICAgICAgLy8gcG9zc2libGUuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBTZXQ8QWN0aW9uPiB0b2FkZCA9IG5ldyBIYXNoU2V0PEFjdGlvbj4oKTsKLSAgICAgICAgZmluYWwgU2V0PEFjdGlvbj4gdG9yZW1vdmUgPSBuZXcgSGFzaFNldDxBY3Rpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIEFjdGlvbiBhY3Rpb24xIDogbmV3QWN0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggQWN0aW9uIGFjdGlvbjIgOiBuZXdBY3Rpb25zICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggYWN0aW9uMS5nZXRUeXBlKCkgPT0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMICYmCi0gICAgICAgICAgICAgICAgICAgIGFjdGlvbjIuZ2V0VHlwZSgpID09IEFjdGlvbi5UeXBlLklOU1RBTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjEgPSBhY3Rpb24xLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjIgPSBhY3Rpb24yLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmMS5nZXRQcm9qZWN0RmFjZXQoKSA9PSBmMi5nZXRQcm9qZWN0RmFjZXQoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcmVtb3ZlLmFkZCggYWN0aW9uMSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9yZW1vdmUuYWRkKCBhY3Rpb24yICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2FkZC5hZGQoIGNyZWF0ZVByb2plY3RGYWNldEFjdGlvbiggb2xkLCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjIgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBuZXdBY3Rpb25zLnJlbW92ZUFsbCggdG9yZW1vdmUgKTsKLSAgICAgICAgbmV3QWN0aW9ucy5hZGRBbGwoIHRvYWRkICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmFjdGlvbnMgPSBuZXdBY3Rpb25zOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0RmFjZXRBY3Rpb25Db25maWcoIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3QWN0aW9uQ29uZmlnICkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24gb2xkQWN0aW9uID0gZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBmYWNldCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBvbGRBY3Rpb24gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gb2xkQWN0aW9uLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpb24gbmV3QWN0aW9uID0gbmV3IEFjdGlvbiggb2xkQWN0aW9uLmdldFR5cGUoKSwgZnYsIG5ld0FjdGlvbkNvbmZpZyApOwotICAgICAgICAgICAgICAgIGJpbmRQcm9qZWN0RmFjZXRBY3Rpb25Db25maWcoIGZ2LCBuZXdBY3Rpb25Db25maWcgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMucmVtb3ZlKCBvbGRBY3Rpb24gKTsKLSAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuYWRkKCBuZXdBY3Rpb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VtZUV2ZW50Tm90aWZpY2F0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHR5cGVzLmxlbmd0aCA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSB0eXBlIDogdHlwZXMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmdldCggdHlwZSApLmFkZCggbGlzdGVuZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKCBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggTGlzdDxJRmFjZXRlZFByb2plY3RMaXN0ZW5lcj4gbGlzdGVuZXJzIDogdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUoIGxpc3RlbmVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApCi0gICAgewotICAgICAgICBMaXN0PElGYWNldGVkUHJvamVjdExpc3RlbmVyPiBsaXN0ZW5lcnNUb05vdGlmeSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnN1c3BlbmRFdmVudE5vdGljYXRpb25Db3VudGVyID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyc1RvTm90aWZ5ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudC5nZXRUeXBlKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlZEV2ZW50cy5hZGQoIGV2ZW50ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBsaXN0ZW5lcnNUb05vdGlmeSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyc1RvTm90aWZ5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KCBldmVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc3VzcGVuZEV2ZW50Tm90aWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zdXNwZW5kRXZlbnROb3RpY2F0aW9uQ291bnRlcisrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZXN1bWVFdmVudE5vdGlmaWNhdGlvbigpCi0gICAgewotICAgICAgICBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiBldmVudHNUb0ZpcmUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnN1c3BlbmRFdmVudE5vdGljYXRpb25Db3VudGVyLS07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnN1c3BlbmRFdmVudE5vdGljYXRpb25Db3VudGVyID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMucXVldWVkRXZlbnRzLmlzRW1wdHkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBldmVudHNUb0ZpcmUgPSBuZXcgQXJyYXlMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PigpOwotICAgICAgICAgICAgICAgICAgICBldmVudHNUb0ZpcmUuYWRkQWxsKCB0aGlzLnF1ZXVlZEV2ZW50cyApOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlZEV2ZW50cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuc3VzcGVuZEV2ZW50Tm90aWNhdGlvbkNvdW50ZXIgPCAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBldmVudHNUb0ZpcmUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgOiBldmVudHNUb0ZpcmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyggZXZlbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE11bHRpU3RhdHVzIG1zID0gQ29uc3RyYWludC5jcmVhdGVNdWx0aVN0YXR1cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISB0aGlzLnByb2plY3ROYW1lVmFsaWRhdGlvbi5pc09LKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c1dyYXBwZXIgd3JhcHBlciA9IG5ldyBTdGF0dXNXcmFwcGVyKCB0aGlzLnByb2plY3ROYW1lVmFsaWRhdGlvbiApOwotICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0Q29kZSggUFJPQkxFTV9QUk9KRUNUX05BTUUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBtcy5hZGQoIHdyYXBwZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJU3RhdHVzIHN0IDogdGhpcy5wcm9ibGVtcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RhdHVzV3JhcHBlciB3cmFwcGVyID0gbmV3IFN0YXR1c1dyYXBwZXIoIHN0ICk7Ci0gICAgICAgICAgICAgICAgd3JhcHBlci5zZXRDb2RlKCBQUk9CTEVNX09USEVSICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbXMuYWRkKCB3cmFwcGVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgcnVudGltZSA6IHRoaXMudGFyZ2V0ZWRSdW50aW1lcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdCA9IHJ1bnRpbWUudmFsaWRhdGUoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBzdC5pc09LKCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5pbnZhbGlkUnVudGltZU1zZywgcnVudGltZS5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNXcmFwcGVyIHdyYXBwZXIgPSBuZXcgU3RhdHVzV3JhcHBlciggc3QgKTsKLSAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5zZXRNZXNzYWdlKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG1zLmFkZCggd3JhcHBlciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG1zOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbigpCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UgPSBnZXRCYXNlUHJvamVjdEZhY2V0cygpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8SVN0YXR1cz4gcHJvYnMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCk7Ci0gICAgICAgIGZpbmFsIE11bHRpU3RhdHVzIG1zID0gKE11bHRpU3RhdHVzKSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jaGVjayggYmFzZSwgdGhpcy5hY3Rpb25zICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElTdGF0dXMgc3QgOiBtcy5nZXRDaGlsZHJlbigpICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvYnMuYWRkKCBzdCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogYmFzZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IGZ2LmdldFByb2plY3RGYWNldCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmLmdldFBsdWdpbklkKCkgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldE5vdEZvdW5kLCBmLmdldElkKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZ2LmdldFBsdWdpbklkKCkgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWNldFZlcnNpb25Ob3RGb3VuZCwgZi5nZXRJZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBtc2cgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdWIKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLldBUk5JTkcsIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIG1zZywgbnVsbCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHByb2JzLmFkZCggc3ViICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWUgciA6IGdldFRhcmdldGVkUnVudGltZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBnZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIHIuc3VwcG9ydHMoIGZ2ICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhY2V0Tm90U3VwcG9ydGVkQnlUYXJnZXQsIGZ2LnRvU3RyaW5nKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRMb2NhbGl6ZWROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgc3ViCi0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIG1zZywgbnVsbCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcHJvYnMuYWRkKCBzdWIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIHByb2JzLmVxdWFscyggdGhpcy5wcm9ibGVtcyApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm9ibGVtcyA9IHByb2JzOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKCBuZXcgRmFjZXRlZFByb2plY3RFdmVudCggdGhpcywgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5WQUxJREFUSU9OX1BST0JMRU1TX0NIQU5HRUQgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvbW1pdENoYW5nZXMoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU3ViTW9uaXRvciBwbSA9IFN1Yk1vbml0b3IuY29udmVydCggbW9uaXRvciwgMTAwICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2tzLCB3ZSBjbG9uZSB0aGUgd29ya2luZyBjb3B5LiBUaGlzIGFsbG93cyB1cyB0byByZWxlYXNlCi0gICAgICAgICAgICAvLyB0aGUgbG9jayBvbiB0aGlzIHdvcmtpbmcgY29weSB3aGlsZSBydW5uaW5nIG1lcmdlQ2hhbmdlcygpLiBUaGlzIGlzIGltcG9ydGFudCBzaW5jZQotICAgICAgICAgICAgLy8gbWVyZ2VDaGFuZ2VzKCkgY2FuIGNhbGwgb3V0IHRvIHRoaXJkLXBhcnR5IGNvZGUuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGNsb25lOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xvbmUgPSBjbG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMucHJvamVjdCA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcGogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHRoaXMucHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RMb2NhdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbS5uZXdDaGlsZCggMTAsIFN1Yk1vbml0b3IuU1VQUFJFU1NfQUxMX0xBQkVMUyApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnBqID0gdGhpcy5wcm9qZWN0OwotICAgICAgICAgICAgICAgIHBtLndvcmtlZCggMTAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgKCAoRmFjZXRlZFByb2plY3QpIGZwaiApLm1lcmdlQ2hhbmdlcyggY2xvbmUsIHBtLm5ld0NoaWxkKCA5MCApICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZXNldCB0aGUgd29ya2luZyBjb3B5IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYWdhaW4uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QgPSBmcGo7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TmFtZVZhbGlkYXRpb24gPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXZlcnRDaGFuZ2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBwbS5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWVyZ2VDaGFuZ2VzKCBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyApCi0gICAgewotICAgICAgICBzdXNwZW5kRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMubG9jayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0UHJvamVjdE5hbWUoIGZwandjLmdldFByb2plY3ROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TG9jYXRpb24oIGZwandjLmdldFByb2plY3RMb2NhdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBmcGp3Yy5nZXRGaXhlZFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAgICAgICAgIHNldFByb2plY3RGYWNldHMoIGZwandjLmdldFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAgICAgICAgIHNldFRhcmdldGVkUnVudGltZXMoIGZwandjLmdldFRhcmdldGVkUnVudGltZXMoKSApOwotICAgICAgICAgICAgICAgIHNldFByaW1hcnlSdW50aW1lKCBmcGp3Yy5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSVByZXNldCBzZWxlY3RlZFByZXNldCA9IGZwandjLmdldFNlbGVjdGVkUHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHNlbGVjdGVkUHJlc2V0ICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRQcmVzZXQoIHNlbGVjdGVkUHJlc2V0LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmFkZEFsbCggKCAoRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgZnBqd2MgICkuYWN0aW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZXZlcnRDaGFuZ2VzKCkKLSAgICB7Ci0gICAgICAgIHN1c3BlbmRFdmVudE5vdGlmaWNhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5sb2NrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlpZiggdGhpcy5wcm9qZWN0ICE9IG51bGwgKQotICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgICAgICAgc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCB0aGlzLnByb2plY3QuZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0VGFyZ2V0ZWRSdW50aW1lcyggQ29sbGVjdGlvbnMuPElSdW50aW1lPmVtcHR5U2V0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvamVjdEZhY2V0cyggdGhpcy5wcm9qZWN0LmdldFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXRUYXJnZXRlZFJ1bnRpbWVzKCB0aGlzLnByb2plY3QuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpICk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlSdW50aW1lKCB0aGlzLnByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJZWxzZQotICAgICAgICAgICAgCXsKLSAgICAgICAgICAgIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdW1lRXZlbnROb3RpZmljYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgY2xvbmUoKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmxvY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGNsb25lID0gbmV3IEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoIHRoaXMucHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5wcm9qZWN0ID09IG51bGwgKQotICAgICAgICAgICAgewotCSAgICAgICAgICAgIGNsb25lLnNldFByb2plY3ROYW1lKCBnZXRQcm9qZWN0TmFtZSgpICk7Ci0JICAgICAgICAgICAgY2xvbmUuc2V0UHJvamVjdExvY2F0aW9uKCBnZXRQcm9qZWN0TG9jYXRpb24oKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjbG9uZS5zZXRGaXhlZFByb2plY3RGYWNldHMoIGdldEZpeGVkUHJvamVjdEZhY2V0cygpICk7Ci0gICAgICAgICAgICBjbG9uZS5zZXRQcm9qZWN0RmFjZXRzKCBnZXRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgICAgIGNsb25lLnNldFRhcmdldGVkUnVudGltZXMoIGdldFRhcmdldGVkUnVudGltZXMoKSApOwotICAgICAgICAgICAgY2xvbmUuc2V0UHJpbWFyeVJ1bnRpbWUoIGdldFByaW1hcnlSdW50aW1lKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVByZXNldCBzZWxlY3RlZFByZXNldCA9IGdldFNlbGVjdGVkUHJlc2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzZWxlY3RlZFByZXNldCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbG9uZS5zZXRTZWxlY3RlZFByZXNldCggc2VsZWN0ZWRQcmVzZXQuZ2V0SWQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjbG9uZS5hY3Rpb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICBjbG9uZS5hY3Rpb25zLmFkZEFsbCggdGhpcy5hY3Rpb25zICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjbG9uZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggdGhpcy5kaXNwb3NlVGFza3MgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIFJ1bm5hYmxlIHRhc2sgOiB0aGlzLmRpc3Bvc2VUYXNrcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YXNrLnJ1bigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGREaXNwb3NlVGFzayggZmluYWwgUnVubmFibGUgdGFzayApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMuZGlzcG9zZVRhc2tzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kaXNwb3NlVGFza3MuYWRkKCB0YXNrICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoIGZpbmFsIE9iamVjdCBvYmoxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqMiApCi0gICAgewotICAgICAgICBpZiggb2JqMSA9PSBvYmoyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggb2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvYmoxLmVxdWFscyggb2JqMiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdWxkTm90U2VsZWN0UHJlc2V0OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldE5vdEZvdW5kOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldFZlcnNpb25Ob3RGb3VuZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFjZXROb3RTdXBwb3J0ZWRCeVRhcmdldDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFJ1bnRpbWVNc2c7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9GYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYWM3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1jb3VsZE5vdFNlbGVjdFByZXNldCA9IENvdWxkIG5vdCBzZWxlY3QgcHJlc2V0ICJ7MH0iLiBPbmUgb3IgbW9yZSByZXF1aXJlZCBvZiB0aGUgcmVxdWlyZWQgZmFjZXRzIGFyZSBub3QgdmlzaWJsZS4KLWZhY2V0Tm90Rm91bmQgPSBJbXBsZW1lbnRhdGlvbiBvZiBwcm9qZWN0IGZhY2V0IHswfSBjb3VsZCBub3QgYmUgZm91bmQuIEZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBsaW1pdGVkLgotZmFjZXRWZXJzaW9uTm90Rm91bmQgPSBJbXBsZW1lbnRhdGlvbiBvZiB2ZXJzaW9uIHsxfSBvZiBwcm9qZWN0IGZhY2V0IHswfSBjb3VsZCBub3QgYmUgZm91bmQuIEZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBsaW1pdGVkLgotZmFjZXROb3RTdXBwb3J0ZWRCeVRhcmdldCA9IFByb2plY3QgZmFjZXQgezB9IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGFyZ2V0IHJ1bnRpbWUgezF9LgotaW52YWxpZFJ1bnRpbWVNc2cgPSBSdW50aW1lICJ7MH0iIGlzIGludmFsaWQuIHsxfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5M2QwNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBJR3JvdXB9IGludGVyZmFjZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEdyb3VwIAotCi0gICAgaW1wbGVtZW50cyBJR3JvdXAgCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IG1lbWJlcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IG1lbWJlcnNSZWFkT25seTsKLSAgICAKLSAgICBHcm91cCgpIAotICAgIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICIiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICB0aGlzLm1lbWJlcnMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgdGhpcy5tZW1iZXJzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIHRoaXMubWVtYmVycyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRJZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLmxhYmVsID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsID0gaWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5sYWJlbDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRMYWJlbCggZmluYWwgU3RyaW5nIGxhYmVsICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXREZXNjcmlwdGlvbiggZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0TWVtYmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5tZW1iZXJzUmVhZE9ubHk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgYWRkTWVtYmVyKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICB0aGlzLm1lbWJlcnMuYWRkKCBmdiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYWJlbCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJlc2V0c0V4dGVuc2lvblBvaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9QcmVzZXRzRXh0ZW5zaW9uUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjNDJjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9QcmVzZXRzRXh0ZW5zaW9uUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1czsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luLmxvZzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luLmxvZ0Vycm9yOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZEV4dGVuc2lvbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5maW5kT3B0aW9uYWxFbGVtZW50OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZFJlcXVpcmVkQXR0cmlidXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuZmluZFJlcXVpcmVkRWxlbWVudDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldEVsZW1lbnRWYWx1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLmdldFRvcExldmVsRWxlbWVudHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5pbnN0YW50aWF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUR5bmFtaWNQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByZXNldERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5JbmRleGVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5JbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgcHJvY2Vzc2luZyB0aGUgPGNvZGU+cHJlc2V0czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJlc2V0c0V4dGVuc2lvblBvaW50Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInByZXNldHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9MRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAiZmFjZXRzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRFlOQU1JQ19QUkVTRVQgPSAiZHluYW1pYy1wcmVzZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZBQ0VUID0gImZhY2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GQUNUT1JZID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0xBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9QUkVTRVQgPSAicHJlc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9TVEFUSUNfUFJFU0VUID0gInN0YXRpYy1wcmVzZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRVhURU5EUyA9ICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ERVNDUklQVElPTiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZFNldDxTdHJpbmcsSVByZXNldD4gcHJlc2V0cyA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SVByZXNldD4gZ2V0UHJlc2V0cygpCi0gICAgewotICAgICAgICByZWFkRXh0ZW5zaW9ucygpOwotICAgICAgICByZXR1cm4gcHJlc2V0cy5nZXRVbm1vZGlmaWFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJlc2V0IGdldFByZXNldCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJlYWRFeHRlbnNpb25zKCk7Ci0gICAgICAgIHJldHVybiBwcmVzZXRzLmdldCggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEV4dGVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgaWYoIHByZXNldHMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJlc2V0cyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJUHJlc2V0PigpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IAotICAgICAgICAgICAgIDogZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluZEV4dGVuc2lvbnMoIFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGVsTmFtZS5lcXVhbHMoIEVMX1NUQVRJQ19QUkVTRVQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkU3RhdGljUHJlc2V0KCBlbGVtZW50ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyIHZpYSB0aGUgbG9nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGVsTmFtZS5lcXVhbHMoIEVMX0RZTkFNSUNfUFJFU0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZER5bmFtaWNQcmVzZXQoIGVsZW1lbnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIgdmlhIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCAKLSAgICAgICAgICAgICA6IGdldFRvcExldmVsRWxlbWVudHMoIGZpbmRFeHRlbnNpb25zKCBQTFVHSU5fSUQsIE9MRF9FWFRFTlNJT05fUE9JTlRfSUQgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyggRUxfUFJFU0VUICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZFN0YXRpY1ByZXNldCggZWxlbWVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGUgdXNlciB2aWEgdGhlIGxvZy4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlc29sdmUgdGhlIGJhc2UgcHJlc2V0cy4gTWFrZSBzdXJlIHRoYXQgbm8gcHJlc2V0cyBhcmUgZXh0ZW5kaW5nIHByZXNldHMgdGhhdCBkbyBub3QKLSAgICAgICAgLy8gZXhpc3QsIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzLCBldGMuCi0gICAgICAgIAotICAgICAgICBTZXQ8SVByZXNldD4gY29weSA9IG5ldyBIYXNoU2V0PElQcmVzZXQ+KCBwcmVzZXRzICk7IAotICAgICAgICAKLSAgICAgICAgZm9yKCBJUHJlc2V0IHByZXNldCA6IGNvcHkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcHJlc2V0cy5jb250YWlucyggcHJlc2V0ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc29sdmVCYXNlUHJlc2V0KCBwcmVzZXQsIG5ldyBIYXNoU2V0PElQcmVzZXQ+KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRmluZCBzdGF0aWMgcHJlc2V0cyB0aGF0IGFyZSBleHRlbmRpbmcgZHluYW1pYyBwcmVzZXRzIGFuZCBtYWtlIHRoZW0gaW50byBkeW5hbWljCi0gICAgICAgIC8vIHByZXNldHMgKFN0YXRpY0V4dGVuZGluZ0R5bmFtaWNQcmVzZXQgY2xhc3MpLgotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBkb0Fub3RoZXJQYXNzID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlKCBkb0Fub3RoZXJQYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgZG9Bbm90aGVyUGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcmVzZXQgcHJlc2V0IDogcHJlc2V0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHByZXNldC5nZXRUeXBlKCkgPT0gSVByZXNldC5UeXBlLlNUQVRJQyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdGF0aWNQcmVzZXQgc3RQcmVzZXQgPSAoU3RhdGljUHJlc2V0KSBwcmVzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlUHJlc2V0SWQgPSBzdFByZXNldC5nZXRCYXNlUHJlc2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBiYXNlUHJlc2V0SWQgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcmVzZXQgYmFzZVByZXNldCA9IGdldFByZXNldCggYmFzZVByZXNldElkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBiYXNlUHJlc2V0LmdldFR5cGUoKSA9PSBJUHJlc2V0LlR5cGUuRFlOQU1JQyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RhdGljRXh0ZW5kaW5nRHluYW1pY1ByZXNldCBzdFByZXNldE5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBTdGF0aWNFeHRlbmRpbmdEeW5hbWljUHJlc2V0KCBzdFByZXNldC5nZXRJZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RQcmVzZXQuZ2V0UGx1Z2luSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RQcmVzZXQuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RQcmVzZXQuZ2V0RGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RQcmVzZXQuZ2V0QmFzZVByZXNldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UHJlc2V0LmdldFByb2plY3RGYWNldHMoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldHMuYWRkKCBzdFByZXNldE5ldy5nZXRJZCgpLCBzdFByZXNldE5ldyApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Bbm90aGVyUGFzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkU3RhdGljUHJlc2V0KCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwgKQotICAgIAotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGVsLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGVsLCBBVFRSX0lEICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxMYWJlbCA9IGZpbmRPcHRpb25hbEVsZW1lbnQoIGVsLCBFTF9MQUJFTCApOwotICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBnZXRFbGVtZW50VmFsdWUoIGVsTGFiZWwsIGlkICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxEZXNjID0gZmluZE9wdGlvbmFsRWxlbWVudCggZWwsIEVMX0RFU0NSSVBUSU9OICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiA9IGdldEVsZW1lbnRWYWx1ZSggZWxEZXNjLCBERUZBVUxUX0RFU0NSSVBUSU9OICk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmFzZVByZXNldCA9IGVsLmdldEF0dHJpYnV0ZSggQVRUUl9FWFRFTkRTICk7Ci0gICAgICAgIAotICAgICAgICBpZiggYmFzZVByZXNldCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZVByZXNldCA9IGJhc2VQcmVzZXQudHJpbSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggYmFzZVByZXNldC5sZW5ndGgoKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlUHJlc2V0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLQotICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA6IGVsLmdldENoaWxkcmVuKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRkFDRVQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZCA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY2hpbGQsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZnZlciA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY2hpbGQsIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggZmlkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLnByZXNldFVzZXNVbmtub3duRmFjZXQsIGlkLCBwbHVnaW5JZCwgZmlkICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBsb2dFcnJvciggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgZiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggZmlkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoICEgZi5oYXNWZXJzaW9uKCBmdmVyICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLnByZXNldFVzZXNVbmtub3duRmFjZXRWZXJzaW9uLCBpZCwgcGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWQsIGZ2ZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBmLmdldFZlcnNpb24oIGZ2ZXIgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmYWNldHMuYWRkKCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdGF0aWNQcmVzZXQgcHJlc2V0IAotICAgICAgICAgICAgPSBuZXcgU3RhdGljUHJlc2V0KCBpZCwgcGx1Z2luSWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgYmFzZVByZXNldCwgZmFjZXRzICk7Ci0gICAgICAgIAotICAgICAgICBwcmVzZXRzLmFkZCggaWQsIHByZXNldCApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZER5bmFtaWNQcmVzZXQoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCApCi0gICAgCi0gICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gZWwuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggZWwsIEFUVFJfSUQgKTsKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsRmFjdG9yeSA9IGZpbmRSZXF1aXJlZEVsZW1lbnQoIGVsLCBFTF9GQUNUT1JZICk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lID0gZmluZFJlcXVpcmVkQXR0cmlidXRlKCBlbEZhY3RvcnksIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIER5bmFtaWNQcmVzZXQgcHJlc2V0ID0gbmV3IER5bmFtaWNQcmVzZXQoIGlkLCBwbHVnaW5JZCwgZmFjdG9yeUNsYXNzTmFtZSApOwotICAgICAgICBwcmVzZXRzLmFkZCggaWQsIHByZXNldCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlc29sdmVCYXNlUHJlc2V0KCBmaW5hbCBJUHJlc2V0IHByZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByZXNldD4gdmlzaXRlZFByZXNldHMgKQotICAgIHsKLSAgICAgICAgaWYoIHByZXNldC5nZXRUeXBlKCkgPT0gSVByZXNldC5UeXBlLlNUQVRJQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0YXRpY1ByZXNldCBzdFByZXNldCA9IChTdGF0aWNQcmVzZXQpIHByZXNldDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlUHJlc2V0SWQgPSBzdFByZXNldC5nZXRCYXNlUHJlc2V0SWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGJhc2VQcmVzZXRJZCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJlc2V0IGJhc2VQcmVzZXQgPSBnZXRQcmVzZXQoIGJhc2VQcmVzZXRJZCApOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvYmxlbSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHZpc2l0ZWRQcmVzZXRzLmFkZCggcHJlc2V0ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGJhc2VQcmVzZXQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMuYmFzZVByZXNldE5vdEZvdW5kLCBzdFByZXNldC5nZXRJZCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0UHJlc2V0LmdldFBsdWdpbklkKCksIGJhc2VQcmVzZXRJZCApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3IoIG1zZyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHZpc2l0ZWRQcmVzZXRzLmNvbnRhaW5zKCBiYXNlUHJlc2V0ICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBjeWNsZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjeWNsZVNpemUgPSB2aXNpdGVkUHJlc2V0cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IoIElQcmVzZXQgdnAgOiB2aXNpdGVkUHJlc2V0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb3VudCA+IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb3VudCA9PSBjeWNsZVNpemUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUuYXBwZW5kKCAiIGFuZCAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUuYXBwZW5kKCAiLCAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLmFwcGVuZCggJyInICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjeWNsZS5hcHBlbmQoIHZwLmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlLmFwcGVuZCggJyInICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmN5Y2xlRGV0ZWN0ZWQsIGN5Y2xlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKCBtc2cgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHByb2JsZW0gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAhIHJlc29sdmVCYXNlUHJlc2V0KCBiYXNlUHJlc2V0LCB2aXNpdGVkUHJlc2V0cyApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2JsZW0gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwcm9ibGVtICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFByZXNldHNFeHRlbnNpb25Qb2ludC5wcmVzZXRzLmRlbGV0ZSggcHJlc2V0LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRpY1ByZXNldAotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElQcmVzZXQKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGx1Z2luSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmFzZVByZXNldElkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBmYWNldHM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldFZlcnNpb25zOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRWZXJzaW9uc1JlYWRPbmx5OwotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0YXRpY1ByZXNldCggZmluYWwgU3RyaW5nIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZVByZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgICAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgICAgICAgICB0aGlzLmJhc2VQcmVzZXRJZCA9IGJhc2VQcmVzZXQ7Ci0gICAgICAgICAgICB0aGlzLmZhY2V0VmVyc2lvbnMgPSBmYWNldHM7Ci0gICAgICAgICAgICB0aGlzLmZhY2V0VmVyc2lvbnNSZWFkT25seSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggdGhpcy5mYWNldFZlcnNpb25zICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldD4oIHRoaXMuZmFjZXRWZXJzaW9ucy5zaXplKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IHRoaXMuZmFjZXRWZXJzaW9ucyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5mYWNldHMuYWRkKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldElkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGx1Z2luSWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5JZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVHlwZS5TVEFUSUM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5sYWJlbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRCYXNlUHJlc2V0SWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlUHJlc2V0SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMuYmFzZVByZXNldElkID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0VmVyc2lvbnNSZWFkT25seTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJlc2V0IGJhc2VQcmVzZXQgPSBnZXRQcmVzZXQoIHRoaXMuYmFzZVByZXNldElkICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbWJpbmVkRmFjZXRTZXQoIGJhc2VQcmVzZXQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzVXNlckRlZmluZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKCBmaW5hbCBPYmplY3Qgb2JqICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgKCBvYmogaW5zdGFuY2VvZiBTdGF0aWNQcmVzZXQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdGF0aWNQcmVzZXQgcCA9IChTdGF0aWNQcmVzZXQpIG9iajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQuZXF1YWxzKCBwLmlkICkgJiYKLSAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbklkLmVxdWFscyggcC5wbHVnaW5JZCApICYmCi0gICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbC5lcXVhbHMoIHAubGFiZWwgKSAmJgotICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24uZXF1YWxzKCBwLmRlc2NyaXB0aW9uICkgJiYKLSAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2V0VmVyc2lvbnMuZXF1YWxzKCBwLmZhY2V0VmVyc2lvbnMgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gY3JlYXRlQ29tYmluZWRGYWNldFNldCggZmluYWwgSVByZXNldCBiYXNlUHJlc2V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZXN1bHQgCi0gICAgICAgICAgICAgICAgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oIHRoaXMuZmFjZXRWZXJzaW9ucyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogYmFzZVByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIHRoaXMuZmFjZXRzLmNvbnRhaW5zKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCByZXN1bHQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTdGF0aWNFeHRlbmRpbmdEeW5hbWljUHJlc2V0Ci0gICAgCi0gICAgICAgIGV4dGVuZHMgU3RhdGljUHJlc2V0Ci0gICAgICAgIGltcGxlbWVudHMgSUR5bmFtaWNQcmVzZXQKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgU3RhdGljRXh0ZW5kaW5nRHluYW1pY1ByZXNldCggZmluYWwgU3RyaW5nIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJhc2VQcmVzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIGlkLCBwbHVnaW5JZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBiYXNlUHJlc2V0SWQsIGZhY2V0cyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUeXBlLkRZTkFNSUM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSVByZXNldCByZXNvbHZlKCBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gY29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElEeW5hbWljUHJlc2V0IGJhc2VQcmVzZXQgPSAoSUR5bmFtaWNQcmVzZXQpIGdldFByZXNldCggZ2V0QmFzZVByZXNldElkKCkgKTsKLSAgICAgICAgICAgIGZpbmFsIElQcmVzZXQgcmVzQmFzZVByZXNldCA9IGJhc2VQcmVzZXQucmVzb2x2ZSggY29udGV4dCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcmVzQmFzZVByZXNldCA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IGNyZWF0ZUNvbWJpbmVkRmFjZXRTZXQoIHJlc0Jhc2VQcmVzZXQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1ByZXNldCggZ2V0SWQoKSwgZ2V0UGx1Z2luSWQoKSwgZ2V0TGFiZWwoKSwgZ2V0RGVzY3JpcHRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhc2VQcmVzZXRJZCgpLCBmYWNldHMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEeW5hbWljUHJlc2V0Ci0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSUR5bmFtaWNQcmVzZXQKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGx1Z2luSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWU7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRHluYW1pY1ByZXNldCggZmluYWwgU3RyaW5nIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgICAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlDbGFzc05hbWUgPSBmYWN0b3J5Q2xhc3NOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFR5cGUuRFlOQU1JQzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckRlZmluZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJUHJlc2V0IHJlc29sdmUoIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBjb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgSVByZXNldEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBpbnN0YW50aWF0ZSggdGhpcy5wbHVnaW5JZCwgdGhpcy5mYWN0b3J5Q2xhc3NOYW1lLCBJUHJlc2V0RmFjdG9yeS5jbGFzcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nKCBlLmdldFN0YXR1cygpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmYWN0b3J5ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByZXNldERlZmluaXRpb24gZGVmID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZiA9IGZhY3RvcnkuY3JlYXRlUHJlc2V0KCB0aGlzLmlkLCBjb250ZXh0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmZhaWxlZFdoaWxlSW52b2tpbmdQcmVzZXRGYWN0b3J5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGxvZyggY3JlYXRlRXJyb3JTdGF0dXMoIG1zZywgZSApICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBkZWYgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdGF0aWNQcmVzZXQgc3RhdGljUHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBTdGF0aWNQcmVzZXQoIHRoaXMuaWQsIHRoaXMucGx1Z2luSWQsIGRlZi5nZXRMYWJlbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLmdldERlc2NyaXB0aW9uKCksIG51bGwsIGRlZi5nZXRQcm9qZWN0RmFjZXRzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNQcmVzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldFVzZXNVbmtub3duRmFjZXQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXNldFVzZXNVbmtub3duRmFjZXRWZXJzaW9uOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlUHJlc2V0Tm90Rm91bmQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGN5Y2xlRGV0ZWN0ZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZFdoaWxlSW52b2tpbmdQcmVzZXRGYWN0b3J5OwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggUHJlc2V0c0V4dGVuc2lvblBvaW50LmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoIGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggdGVtcGxhdGUsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMgfSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZCggZmluYWwgU3RyaW5nIHRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggdGVtcGxhdGUsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgfSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJlc2V0c0V4dGVuc2lvblBvaW50LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9QcmVzZXRzRXh0ZW5zaW9uUG9pbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlZjY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9QcmVzZXRzRXh0ZW5zaW9uUG9pbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHJlc2V0VXNlc1Vua25vd25GYWNldCA9IFByZXNldCB7MH0gaW4gcGx1Z2luIHsxfSB1c2VzIHVua25vd24gZmFjZXQgInsyfSIuCi1wcmVzZXRVc2VzVW5rbm93bkZhY2V0VmVyc2lvbiA9IFByZXNldCB7MH0gaW4gcGx1Z2luIHsxfSB1c2VzIHVua25vd24gdmVyc2lvbiAiezN9IiBvZiBmYWNldCAiezJ9Ii4KLWJhc2VQcmVzZXROb3RGb3VuZCA9IFByZXNldCB7MH0gaW4gcGx1Z2luIHsxfSBzcGVjaWZpZXMgYmFzZSBwcmVzZXQgInsyfSIgd2hpY2ggZG9lcyBub3QgZXhpc3QuCi1jeWNsZURldGVjdGVkID0gQ3ljbGUgZGV0ZWN0ZWQgYW1vbmcgdGhlc2UgcHJlc2V0czogezB9Ci1mYWlsZWRXaGlsZUludm9raW5nUHJlc2V0RmFjdG9yeSA9IEZhaWxlZCB3aGlsZSBpbnZva2luZyBwcmVzZXQgZmFjdG9yeSAiezB9Ii4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGM4ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLk1pc2NVdGlsLmVxdWFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlZlcnNpb25hYmxlOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SVByb2plY3RGYWNldDwvY29kZT4gaW50ZXJmYWNlLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdEZhY2V0IAotCi0gICAgZXh0ZW5kcyBWZXJzaW9uYWJsZTxJUHJvamVjdEZhY2V0VmVyc2lvbj4KLSAgICBpbXBsZW1lbnRzIElQcm9qZWN0RmFjZXQgCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luOwotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgSUNhdGVnb3J5IGNhdGVnb3J5OwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJQWN0aW9uRGVmaW5pdGlvbj4gYWN0aW9uRGVmaW5pdGlvbnM7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdEZhY2V0VmVyc2lvbiBkZWZhdWx0VmVyc2lvbjsKLSAgICBwcml2YXRlIElEZWZhdWx0VmVyc2lvblByb3ZpZGVyIGRlZmF1bHRWZXJzaW9uUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBwcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgCi0gICAgUHJvamVjdEZhY2V0KCkgCi0gICAgewotICAgICAgICB0aGlzLmFjdGlvbkRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4oKTsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoIHRoaXMucHJvcGVydGllcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRJZCggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW47Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UGx1Z2luSWQoIGZpbmFsIFN0cmluZyBwbHVnaW4gKQotICAgIHsKLSAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldExhYmVsKCBmaW5hbCBTdHJpbmcgbGFiZWwgKQotICAgIHsKLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldERlc2NyaXB0aW9uKCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24gKQotICAgIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3J5OwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldENhdGVnb3J5KCBmaW5hbCBJQ2F0ZWdvcnkgY2F0ZWdvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlciApCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb25zLmFkZCggdmVyLmdldFZlcnNpb25TdHJpbmcoKSwgdmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uKCBmaW5hbCBJUnVudGltZSByICkKLSAgICB7Ci0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBnZXRTb3J0ZWRWZXJzaW9ucyggZmFsc2UgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCByLnN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZGVmdmVyID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLmRlZmF1bHRWZXJzaW9uUHJvdmlkZXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZnZlciA9IHRoaXMuZGVmYXVsdFZlcnNpb25Qcm92aWRlci5nZXREZWZhdWx0VmVyc2lvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBkZWZ2ZXIgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGRlZnZlci5nZXRQcm9qZWN0RmFjZXQoKSAhPSB0aGlzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy52ZXJzaW9uUHJvdmlkZXJSZXR1cm5lZFdyb25nVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZnZlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZGVmdmVyID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZnZlciA9IGdldExhdGVzdFZlcnNpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGRlZnZlcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWZXJzaW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0RGVmYXVsdFZlcnNpb24oIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFZlcnNpb24gPSBmdjsKLSAgICAgICAgdGhpcy5kZWZhdWx0VmVyc2lvblByb3ZpZGVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXREZWZhdWx0VmVyc2lvblByb3ZpZGVyKCBJRGVmYXVsdFZlcnNpb25Qcm92aWRlciBwcm92aWRlciApCi0gICAgewotICAgICAgICB0aGlzLmRlZmF1bHRWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdGhpcy5kZWZhdWx0VmVyc2lvblByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlciggZmluYWwgQ2xhc3MgdHlwZSApCi0gICAgewotICAgICAgICByZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlciggdGhpcywgdHlwZS5nZXROYW1lKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVWZXJzaW9uTm90Rm91bmRFcnJNc2coIGZpbmFsIFN0cmluZyB2ZXJzdHIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwuUmVzb3VyY2VzLmZhY2V0VmVyc2lvbk5vdERlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCwgdmVyc3RyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KCBuYW1lICk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoIG5hbWUsIHZhbHVlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvbkhpZGRlbigpCi0gICAgewotICAgICAgICByZXR1cm4gKCB0aGlzLnZlcnNpb25zLnNpemUoKSA9PSAxICYmCi0gICAgICAgICAgICAgICAgIGVxdWFsKCBnZXRQcm9wZXJ0eSggUFJPUF9ISURFX1ZFUlNJT04gKSwgdHJ1ZSApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgfQotICAgIAotICAgIFNldDxJQWN0aW9uRGVmaW5pdGlvbj4gZ2V0QWN0aW9uRGVmaW5pdGlvbnMoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJQWN0aW9uRGVmaW5pdGlvbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SUFjdGlvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElBY3Rpb25EZWZpbml0aW9uIGRlZiA6IHRoaXMuYWN0aW9uRGVmaW5pdGlvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZGVmLmdldFZlcnNpb25FeHByKCkuY2hlY2soIGZ2ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIGRlZiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZEFjdGlvbkRlZmluaXRpb24oIGZpbmFsIEFjdGlvbkRlZmluaXRpb24gYWN0aW9uRGVmaW5pdGlvbiApCi0gICAgewotICAgICAgICB0aGlzLmFjdGlvbkRlZmluaXRpb25zLmFkZCggYWN0aW9uRGVmaW5pdGlvbiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25Qcm92aWRlclJldHVybmVkV3JvbmdWZXJzaW9uOwotICAgICAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggUHJvamVjdEZhY2V0LmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNmYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXZlcnNpb25Qcm92aWRlclJldHVybmVkV3JvbmdWZXJzaW9uID0gVmVyc2lvbiBwcm92aWRlciBmb3IgZmFjZXQgezB9IHJldHVybmVkIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBmYWNldC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNGU2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwucmVwb3J0TWlzc2luZ0F0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb25FeHByOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVmVyc2lvbkV4cHI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RGYWNldFJlZgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIElQcm9qZWN0RmFjZXQgZjsKLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25FeHByPElQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXhwcjsKLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyBQcm9qZWN0RmFjZXRSZWYoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgKQotICAgIHsKLSAgICAgICAgdGhpcyggZiwgKFZlcnNpb25FeHByPElQcm9qZWN0RmFjZXRWZXJzaW9uPikgdmV4cHIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvamVjdEZhY2V0UmVmKCBmaW5hbCBJUHJvamVjdEZhY2V0IGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVyc2lvbkV4cHI8SVByb2plY3RGYWNldFZlcnNpb24+IHZleHByICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZiA9IGY7Ci0gICAgICAgIHRoaXMudmV4cHIgPSB2ZXhwcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0RmFjZXQgZ2V0UHJvamVjdEZhY2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmY7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJVmVyc2lvbkV4cHIgZ2V0VmVyc2lvbkV4cHIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmV4cHI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc1ZlcnNpb25FeHByKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoIHRoaXMudmV4cHIgIT0gbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjaGVjayggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuZiA9PSBmdi5nZXRQcm9qZWN0RmFjZXQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnZleHByICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZleHByLmNoZWNrKCBmdiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2soIGZpbmFsIENvbGxlY3Rpb248SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyApCi0gICAgewotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZmFjZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNoZWNrKCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RGYWNldFJlZiByZWFkKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLQotICAgICAgICBpZiggaWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9JRCApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggaWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC5yZXBvcnRNaXNzaW5nRmFjZXQoIGlkLCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgdiA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICBWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPiB2ZXhwciA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiggdiAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIHZleHByID0gbmV3IFZlcnNpb25FeHByPFByb2plY3RGYWNldFZlcnNpb24+KCBmLCB2LCBwbHVnaW5JZCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFByb2plY3RGYWNldFJlZiggZiwgdmV4cHIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBpZiggdGhpcy52ZXhwciA9PSBudWxsIHx8ICggKFByb2plY3RGYWNldCkgdGhpcy5mICkuaXNWZXJzaW9uSGlkZGVuKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mLmdldExhYmVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdGhpcy52ZXhwci5pc1NpbmdsZVZlcnNpb25NYXRjaCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCBSZXNvdXJjZXMuZXhhY3RWZXJzaW9uLCB0aGlzLmYuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXhwci50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdGhpcy52ZXhwci5pc1NpbXBsZUFsbG93TmV3ZXIoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLmFsbG93TmV3ZXIsIHRoaXMuZi5nZXRMYWJlbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZleHByLmdldEZpcnN0VmVyc2lvbigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggdGhpcy52ZXhwci5pc1dpbGRjYXJkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJlc291cmNlcy53aWxkY2FyZCwgdGhpcy5mLmdldExhYmVsKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLnZlcnNpb25FeHByLCB0aGlzLmYuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXhwci50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBleGFjdFZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsbG93TmV3ZXI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpbGRjYXJkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uRXhwcjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFByb2plY3RGYWNldFJlZi5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFJlZi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0UmVmLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGM5MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0UmVmLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWV4YWN0VmVyc2lvbiA9IHswfSB7MX0KLWFsbG93TmV3ZXIgPSB7MH0gezF9IG9yIG5ld2VyCi13aWxkY2FyZCA9IGFueSB2ZXJzaW9uIG9mIHswfQotdmVyc2lvbkV4cHIgPSB7MH0gd2l0aCB2ZXJzaW9uIG1hdGNoaW5nIGV4cHJlc3Npb24gInsxfSIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFZlcnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1Byb2plY3RGYWNldFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxY2UwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVmVyc2lvbmFibGU7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5JUHJvamVjdEZhY2V0VmVyc2lvbjwvY29kZT4gaW50ZXJmYWNlLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdEZhY2V0VmVyc2lvbiAKLQotICAgIGltcGxlbWVudHMgSVByb2plY3RGYWNldFZlcnNpb24KLSAgICAKLXsKLSAgICBwcml2YXRlIFByb2plY3RGYWNldCBmYWNldDsKLSAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotICAgIHByaXZhdGUgSUNvbnN0cmFpbnQgY29uc3RyYWludDsKLSAgICBwcml2YXRlIFN0cmluZyBwbHVnaW47Ci0gICAgcHJpdmF0ZSBNYXA8SVByb2plY3RGYWNldFZlcnNpb24sSW50ZWdlcj4gY29tcFRhYmxlID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBwcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxPYmplY3Q+IHByb3BlcnRpZXNSZWFkT25seTsKLSAgICAKLSAgICBQcm9qZWN0RmFjZXRWZXJzaW9uKCkgCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PigpOwotICAgICAgICB0aGlzLnByb3BlcnRpZXNSZWFkT25seSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCggdGhpcy5wcm9wZXJ0aWVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0IGdldFByb2plY3RGYWNldCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXQ7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UHJvamVjdEZhY2V0KCBmaW5hbCBQcm9qZWN0RmFjZXQgZmFjZXQgKQotICAgIHsKLSAgICAgICAgdGhpcy5mYWNldCA9IGZhY2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRWZXJzaW9uU3RyaW5nKCBmaW5hbCBTdHJpbmcgdmVyc2lvbiApCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVmVyc2lvbmFibGU8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFZlcnNpb25hYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0OwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29uc3RyYWludCBnZXRDb25zdHJhaW50KCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLmNvbnN0cmFpbnQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCB0aGlzLCBJQ29uc3RyYWludC5UeXBlLkFORCwgbmV3IE9iamVjdFsgMCBdICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnQ7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0Q29uc3RyYWludCggZmluYWwgSUNvbnN0cmFpbnQgY29uc3RyYWludCApCi0gICAgewotICAgICAgICB0aGlzLmNvbnN0cmFpbnQgPSBjb25zdHJhaW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRQbHVnaW5JZCggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRDb21wYXJpc29uVGFibGUoIGZpbmFsIE1hcDxJUHJvamVjdEZhY2V0VmVyc2lvbixJbnRlZ2VyPiBjb21wVGFibGUgKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wVGFibGUgPSBjb21wVGFibGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoIGdldEFjdGlvbkRlZmluaXRpb25JbnRlcm5hbCggYmFzZSwgdHlwZSApICE9IG51bGwgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBY3Rpb25EZWZpbml0aW9uKCB0eXBlICkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IGdldEFjdGlvbkRlZmluaXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0LmdldEFjdGlvbkRlZmluaXRpb25zKCB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8SUFjdGlvbkRlZmluaXRpb24+IGdldEFjdGlvbkRlZmluaXRpb25zKCBmaW5hbCBBY3Rpb24uVHlwZSB0eXBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJQWN0aW9uRGVmaW5pdGlvbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SUFjdGlvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElBY3Rpb25EZWZpbml0aW9uIGRlZiA6IGdldEFjdGlvbkRlZmluaXRpb25zKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZGVmLmdldEFjdGlvblR5cGUoKSA9PSB0eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCBkZWYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCByZXN1bHQuc2l6ZSgpID4gMSAmJiB0eXBlICE9IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzLmJpbmQoIFJlc291cmNlcy5tdWx0aXBsZUFjdGlvbkRlZmluaXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFjZXQuZ2V0SWQoKSwgdGhpcy52ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nV2FybmluZyggbXNnLCB0cnVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElBY3Rpb25EZWZpbml0aW9uIGRlZiA9IGdldEFjdGlvbkRlZmluaXRpb25JbnRlcm5hbCggYmFzZSwgdHlwZSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGRlZiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuYWN0aW9uTm90U3VwcG9ydGVkLCB0b1N0cmluZygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRlZjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJQWN0aW9uRGVmaW5pdGlvbiBnZXRBY3Rpb25EZWZpbml0aW9uSW50ZXJuYWwoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aW9uLlR5cGUgdHlwZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElBY3Rpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucyA9IGdldEFjdGlvbkRlZmluaXRpb25zKCB0eXBlICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZGVmaW5pdGlvbnMuc2l6ZSgpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0eXBlID09IEFjdGlvbi5UeXBlLlZFUlNJT05fQ0hBTkdFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmcm9tVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiB4IDogYmFzZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeC5nZXRQcm9qZWN0RmFjZXQoKSA9PSB0aGlzLmZhY2V0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVZlcnNpb24gPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGZyb21WZXJzaW9uICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJQWN0aW9uRGVmaW5pdGlvbiBkZWYgOiBkZWZpbml0aW9ucyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChJVmVyc2lvbkV4cHIpIGRlZi5nZXRQcm9wZXJ0eSggSUFjdGlvbkRlZmluaXRpb24uUFJPUF9GUk9NX1ZFUlNJT05TICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2ZXhwciA9PSBudWxsIHx8IHZleHByLmNoZWNrKCBmcm9tVmVyc2lvbiApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbml0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIElBY3Rpb25EZWZpbml0aW9uIGdldEFjdGlvbkRlZmluaXRpb24oIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldCBkZWZpbml0aW9ucyA9IGdldEFjdGlvbkRlZmluaXRpb25zKCB0eXBlICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZGVmaW5pdGlvbnMuc2l6ZSgpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSUFjdGlvbkRlZmluaXRpb24pIGRlZmluaXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVBY3Rpb25Db25maWcoIGZpbmFsIEFjdGlvbi5UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwam5hbWUgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCAhIHN1cHBvcnRzKCB0eXBlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnIAotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5hY3Rpb25Ob3RTdXBwb3J0ZWQsIHRvU3RyaW5nKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2cgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQWN0aW9uRGVmaW5pdGlvbiBkZWYgPSBnZXRBY3Rpb25EZWZpbml0aW9uKCB0eXBlICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZGVmID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWYuY3JlYXRlQ29uZmlnT2JqZWN0KCB0aGlzLCBwam5hbWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZUFjdGlvbkNvbmZpZyggZmluYWwgQWN0aW9uLlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICByZXR1cm4gKCAoUHJvamVjdEZhY2V0VmVyc2lvbikgZnYgKS5nZXRBY3Rpb25EZWZpbml0aW9uKCB0eXBlICkgPT0gZ2V0QWN0aW9uRGVmaW5pdGlvbiggdHlwZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRm9yKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKQotICAgIHsKLSAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGYgOiBmaXhlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLmZhY2V0ID09IGYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IGZpeGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBjb25mbGljdHNXaXRoQWxsVmVyc2lvbnMgPSB0cnVlOwotCi0gICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISBjb25mbGljdHNXaXRoKCBmdiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0c1dpdGhBbGxWZXJzaW9ucyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjb25mbGljdHNXaXRoQWxsVmVyc2lvbnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNvbmZsaWN0c1dpdGgoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzID09IGZ2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHRoaXMuZmFjZXQgPT0gZnYuZ2V0UHJvamVjdEZhY2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb25mbGljdHNXaXRoKCBmdiwgZ2V0Q29uc3RyYWludCgpICkgfHwgCi0gICAgICAgICAgICAgICAgICAgY29uZmxpY3RzV2l0aCggdGhpcywgZnYuZ2V0Q29uc3RyYWludCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbmZsaWN0c1dpdGgoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludCBvcCApCi0gICAgewotICAgICAgICBpZiggb3AuZ2V0VHlwZSgpID09IElDb25zdHJhaW50LlR5cGUuQU5EICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBPYmplY3Qgb3BlcmFuZCA6IG9wLmdldE9wZXJhbmRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBjb25mbGljdHNXaXRoKCBmdiwgKElDb25zdHJhaW50KSBvcGVyYW5kICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggb3AuZ2V0VHlwZSgpID09IElDb25zdHJhaW50LlR5cGUuT1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGFsbEJyYW5jaGVzQ29uZmxpY3QgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIE9iamVjdCBvcGVyYW5kIDogb3AuZ2V0T3BlcmFuZHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICEgY29uZmxpY3RzV2l0aCggZnYsIChJQ29uc3RyYWludCkgb3BlcmFuZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFsbEJyYW5jaGVzQ29uZmxpY3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gYWxsQnJhbmNoZXNDb25mbGljdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvcC5nZXRUeXBlKCkgPT0gSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZmlyc3RPcGVyYW5kID0gb3AuZ2V0T3BlcmFuZCggMCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZmlyc3RPcGVyYW5kIGluc3RhbmNlb2YgSUdyb3VwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJR3JvdXAgZ3JvdXAgPSAoSUdyb3VwKSBmaXJzdE9wZXJhbmQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldE1lbWJlcnMoKS5jb250YWlucyggZnYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSAoSVByb2plY3RGYWNldCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgIGZpbmFsIElWZXJzaW9uRXhwciB2ZXhwciA9IChJVmVyc2lvbkV4cHIpIG9wLmdldE9wZXJhbmQoIDEgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZnYuZ2V0UHJvamVjdEZhY2V0KCkgPT0gZiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggdmV4cHIuY2hlY2soIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggb3AuZ2V0VHlwZSgpID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBCb29sZWFuIHNvZnQKLSAgICAgICAgICAgICAgICA9IChCb29sZWFuKSBvcC5nZXRPcGVyYW5kKCBvcC5nZXRPcGVyYW5kcygpLnNpemUoKSAtIDEgKTsKLSAgICAgICAgCi0gICAgICAgICAgICBpZiggc29mdC5lcXVhbHMoIEJvb2xlYW4uVFJVRSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZpcnN0T3BlcmFuZCA9IG9wLmdldE9wZXJhbmQoIDAgKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGNvbmZsaWN0c1dpdGhBbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBmaXJzdE9wZXJhbmQgaW5zdGFuY2VvZiBJR3JvdXAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUdyb3VwIGdyb3VwID0gKElHcm91cCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBtZW1iZXIgOiBncm91cC5nZXRNZW1iZXJzKCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggISBtZW1iZXIuY29uZmxpY3RzV2l0aCggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzV2l0aEFsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXQgcmYgPSAoSVByb2plY3RGYWNldCkgZmlyc3RPcGVyYW5kOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgPSAoSVZlcnNpb25FeHByKSBvcC5nZXRPcGVyYW5kKCAxICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZleHByc3RyID0gdmV4cHIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiByZnYgOiByZi5nZXRWZXJzaW9ucyggdmV4cHJzdHIgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgcmZ2LmNvbmZsaWN0c1dpdGgoIGZ2ICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RzV2l0aEFsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gY29uZmxpY3RzV2l0aEFsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgewotICAgICAgICBpZiggb2JqID09IHRoaXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0RmFjZXRWZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIG9iajsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZ2LmdldFByb2plY3RGYWNldCgpICE9IHRoaXMuZmFjZXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmNhbm5vdENvbXBhcmVWZXJzaW9uc09mRGlmZmVyZW50RmFjZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2V0LmdldElkKCksIHRoaXMudmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBtc2cgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBjYWNoZWRSZXN1bHQgPSB0aGlzLmNvbXBUYWJsZS5nZXQoIGZ2ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjYWNoZWRSZXN1bHQgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdC5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wID0gdGhpcy5mYWNldC5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOwotICAgICAgICAgICAgcmV0dXJuIGNvbXAuY29tcGFyZSggdGhpcy52ZXJzaW9uLCAoIChJVmVyc2lvbikgb2JqICkuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXNSZWFkT25seTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoIG5hbWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dCggbmFtZSwgdmFsdWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICBpZiggdGhpcy5mYWNldC5pc1ZlcnNpb25IaWRkZW4oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0LmdldExhYmVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldC5nZXRMYWJlbCgpICsgIiAiICsgdGhpcy52ZXJzaW9uOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTm90U3VwcG9ydGVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtdWx0aXBsZUFjdGlvbkRlZmluaXRpb25zOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RDb21wYXJlVmVyc2lvbnNPZkRpZmZlcmVudEZhY2V0czsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFByb2plY3RGYWNldFZlcnNpb24uY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoIGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggdGVtcGxhdGUsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMgfSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZCggZmluYWwgU3RyaW5nIHRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggdGVtcGxhdGUsIG5ldyBPYmplY3RbXSB7IGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgfSApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRWZXJzaW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0RmFjZXRWZXJzaW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2IyYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUHJvamVjdEZhY2V0VmVyc2lvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1hY3Rpb25Ob3RTdXBwb3J0ZWQgPSBQcm9qZWN0IGZhY2V0IHswfSBkb2VzIG5vdCBzdXBwb3J0IGFjdGlvbiB0eXBlIHsxfS4KLW11bHRpcGxlQWN0aW9uRGVmaW5pdGlvbnMgPSBNb3JlIHRoYW4gb25lIGRlY2xhcmF0aW9uIGZvdW5kIGZvciBhY3Rpb24gdHlwZSB7Mn0gb2YgcHJvamV0IGZhY2V0IHswfSB7MX0uCi0KLWNhbm5vdENvbXBhcmVWZXJzaW9uc09mRGlmZmVyZW50RmFjZXRzID0gXAotICBDYW5ub3QgY29tcGFyZSB2ZXJzaW9ucyBvZiBkaWZmZXJlbnQgZmFjZXRzIHRvIGVhY2ggb3RoZXIuIEF0dGVtcHRlZCB0byBcCi0gIGNvbXBhcmUgdmVyc2lvbiB7MX0gb2YgZmFjZXQgezB9IHdpdGggdmVyc2lvbiB7M30gb2YgZmFjZXQgezJ9LiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VHlwZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFR5cGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4ODkzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VHlwZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5QbHVnaW5VdGlsLnJlcG9ydE1pc3NpbmdBdHRyaWJ1dGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbkV4cHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmludGVybmFsLlJ1bnRpbWVDb21wb25lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVmVyc2lvbkV4cHI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdDsKLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25FeHByPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gdmV4cHI7Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgUnVudGltZUNvbXBvbmVudFR5cGVSZWYoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVmVyc2lvbkV4cHIgdmV4cHIgKQotICAgIHsKLSAgICAgICAgdGhpcyggcmN0LCAoVmVyc2lvbkV4cHI8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPikgdmV4cHIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUnVudGltZUNvbXBvbmVudFR5cGVSZWYoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWZXJzaW9uRXhwcjxJUnVudGltZUNvbXBvbmVudFZlcnNpb24+IHZleHByICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmN0ID0gcmN0OwotICAgICAgICB0aGlzLnZleHByID0gdmV4cHI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrKCBmaW5hbCBTZXQ8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiByY3ZzICkKLSAgICB7Ci0gICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiA6IHJjdnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5yY3QgPT0gcmN2LmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB0aGlzLnZleHByICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmV4cHIuY2hlY2soIHJjdiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBSdW50aW1lQ29tcG9uZW50VHlwZVJlZiByZWFkKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotCi0gICAgICAgIGlmKCBpZCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0lEICk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoICEgUnVudGltZU1hbmFnZXIuaXNSdW50aW1lQ29tcG9uZW50VHlwZURlZmluZWQoIGlkICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGwucmVwb3J0TWlzc2luZ1J1bnRpbWVDb21wb25lbnRUeXBlKCBpZCwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFR5cGUgcmN0ID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgdiA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfVkVSU0lPTiApOwotICAgICAgICBWZXJzaW9uRXhwcjxSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gdmV4cHIgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYoIHYgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZleHByID0gbmV3IFZlcnNpb25FeHByPFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiggcmN0LCB2LCBwbHVnaW5JZCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IFJ1bnRpbWVDb21wb25lbnRUeXBlUmVmKCByY3QsIHZleHByICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVXNlclByZXNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVXNlclByZXNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjcxZGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1VzZXJQcmVzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgSVByZXNldH0gaW50ZXJmYWNlIHRoYXQncyB1c2VkIGZvciB1c2VyLWRlZmluZWQgcHJlc2V0cy4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFVzZXJQcmVzZXQKLQotICAgIGltcGxlbWVudHMgSVByZXNldAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHM7Ci0gICAgCi0gICAgcHVibGljIFVzZXJQcmVzZXQoIGZpbmFsIFN0cmluZyBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkgCi0gICAgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB0aGlzLmZhY2V0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCBmYWNldHMgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUeXBlLlVTRVJfREVGSU5FRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY2V0czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VyRGVmaW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVmFsaWRhdGlvblByb2JsZW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL2ludGVybmFsL1ZhbGlkYXRpb25Qcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzA5YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVmFsaWRhdGlvblByb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblByb2JsZW0gCi0KLSAgICBleHRlbmRzIFN0YXR1cwotICAgIAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZQotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIFJFUVVJUkVTIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnJlcXVpcmVzICk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgUkVRVUlSRVNfT05FX09GX1RXTwotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnJlcXVpcmVzT25lT2ZUd28gKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBSRVFVSVJFU19HUk9VUAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnJlcXVpcmVzR3JvdXAgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ09ORkxJQ1RTIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLm9uZW9mICk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ09NUExFWCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy5jb21wbGV4ICk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgSU5TVEFMTF9OT1RfU1VQUE9SVEVEIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLmluc3RhbGxOb3RTdXBwb3J0ZWQgKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBVTklOU1RBTExfTk9UX1NVUFBPUlRFRCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy51bmluc3RhbGxOb3RTdXBwb3J0ZWQgKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBWRVJTSU9OX0NIQU5HRV9OT1RfU1VQUE9SVEVEIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLnZlcnNpb25DaGFuZ2VOb3RTdXBwb3J0ZWQgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgTVVMVElQTEVfQUNUSU9OU19OT1RfU1VQUE9SVEVEIAotICAgICAgICAgICAgPSBuZXcgVHlwZSggUmVzb3VyY2VzLm11bHRpcGxlQWN0aW9uc05vdFN1cHBvcnRlZCApOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBGQUNFVF9BTFJFQURZX0lOU1RBTExFRCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy5mYWNldEFscmVhZHlJbnN0YWxsZWQgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ0FOTk9UX1VOSU5TVEFMTCAKLSAgICAgICAgICAgID0gbmV3IFR5cGUoIFJlc291cmNlcy5jYW5ub3RVbmluc3RhbGwgKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQ0FOTk9UX0NIQU5HRV9WRVJTSU9OCi0gICAgICAgICAgICA9IG5ldyBUeXBlKCBSZXNvdXJjZXMuY2Fubm90Q2hhbmdlVmVyc2lvbiApOwotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtc2c7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFR5cGUoIGZpbmFsIFN0cmluZyBtc2cgKSAKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlVGVtcGxhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5tc2c7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBwYXJhbXM7Ci0gICAgCi0gICAgcHVibGljIFZhbGlkYXRpb25Qcm9ibGVtKCBmaW5hbCBUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBwYXJhbXMgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIEVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBmb3JtYXQoIHR5cGUsIHBhcmFtcyApLCAKLSAgICAgICAgICAgICAgIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVmFsaWRhdGlvblByb2JsZW0oIGZpbmFsIFR5cGUgdHlwZSApCi0gICAgewotICAgICAgICB0aGlzKCB0eXBlLCBuZXcgT2JqZWN0WyAwIF0gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblByb2JsZW0oIGZpbmFsIFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJhbSApCi0gICAgewotICAgICAgICB0aGlzKCB0eXBlLCBuZXcgT2JqZWN0W10geyBwYXJhbSB9ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBWYWxpZGF0aW9uUHJvYmxlbSggZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHBhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJhbTIgKQotICAgIHsKLSAgICAgICAgdGhpcyggdHlwZSwgbmV3IE9iamVjdFtdIHsgcGFyYW0xLCBwYXJhbTIgfSApOwotICAgIH0KLQotICAgIHB1YmxpYyBWYWxpZGF0aW9uUHJvYmxlbSggZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHBhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJhbTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcGFyYW0zICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIHR5cGUsIG5ldyBPYmplY3RbXSB7IHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMgfSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRQYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmFtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIGZpbmFsIE9iamVjdCBvYmogKQotICAgIHsKLSAgICAgICAgaWYoICEgKCBvYmogaW5zdGFuY2VvZiBWYWxpZGF0aW9uUHJvYmxlbSApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgVmFsaWRhdGlvblByb2JsZW0gcHJvYiA9IChWYWxpZGF0aW9uUHJvYmxlbSkgb2JqOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVxdWFscyggcHJvYi50eXBlICkgJiYKLSAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKCB0aGlzLnBhcmFtcywgcHJvYi5wYXJhbXMgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgCWludCBoYXNoID0gMDsKLSAgICAgICAgCi0gICAgCWZvciggaW50IGkgPSAwOyBpIDwgdGhpcy5wYXJhbXMubGVuZ3RoOyBpKysgKSAKLSAgICAgICAgewotCQkJaGFzaCA9IGhhc2ggXiB0aGlzLnBhcmFtc1sgaSBdLmhhc2hDb2RlKCk7Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGlzLnR5cGUuaGFzaENvZGUoKSBeIGhhc2g7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdCggZmluYWwgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhcmFtcyApCi0gICAgewotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIHR5cGUuZ2V0TWVzc2FnZVRlbXBsYXRlKCksIHBhcmFtcyApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXF1aXJlczsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWlyZXNPbmVPZlR3bzsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWlyZXNHcm91cDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgb25lb2Y7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBsZXg7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxOb3RTdXBwb3J0ZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaW5zdGFsbE5vdFN1cHBvcnRlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkNoYW5nZU5vdFN1cHBvcnRlZDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbXVsdGlwbGVBY3Rpb25zTm90U3VwcG9ydGVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldEFscmVhZHlJbnN0YWxsZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdFVuaW5zdGFsbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90Q2hhbmdlVmVyc2lvbjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFZhbGlkYXRpb25Qcm9ibGVtLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9WYWxpZGF0aW9uUHJvYmxlbS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvaW50ZXJuYWwvVmFsaWRhdGlvblByb2JsZW0ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxMTAwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9pbnRlcm5hbC9WYWxpZGF0aW9uUHJvYmxlbS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcmVxdWlyZXMgPSB7MH0gcmVxdWlyZXMgezF9LgotcmVxdWlyZXNPbmVPZlR3byA9IHswfSByZXF1aXJlcyB7MX0gb3IgezJ9LgotcmVxdWlyZXNHcm91cCA9IHswfSByZXF1aXJlcyBhbnkgbWVtYmVyIG9mIHsxfS4KLW9uZW9mID0gezB9IGFuZCB7MX0gY2Fubm90IGJvdGggYmUgc2VsZWN0ZWQuCi1jb21wbGV4ID0gQ29uc3RyYWludHMgZm9yIHswfSBoYXZlIG5vdCBiZWVuIG1ldC4KLWluc3RhbGxOb3RTdXBwb3J0ZWQgPSB7MH0gezF9IGNhbm5vdCBiZSBpbnN0YWxsZWQuCi11bmluc3RhbGxOb3RTdXBwb3J0ZWQgPSB7MH0gezF9IGNhbm5vdCBiZSB1bmluc3RhbGxlZC4KLXZlcnNpb25DaGFuZ2VOb3RTdXBwb3J0ZWQgPSBDYW5ub3QgY2hhbmdlIHZlcnNpb24gb2YgcHJvamVjdCBmYWNldCB7MH0gdG8gezF9LgotbXVsdGlwbGVBY3Rpb25zTm90U3VwcG9ydGVkID0gTXVsdGlwbGUgYWN0aW9ucyBvbiB0aGUgc2FtZSBwcm9qZWN0IGZhY2V0IGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoZSBzYW1lIGJhdGNoLiBUaGUgb25seSBleGNlcHRpb24gaXMgYW4gdW5pbnN0YWxsIG9mIGEgcHJldmlvc2x5LWluc3RhbGxlZCB2ZXJzaW9uIGZvbGxvd2VkIGJ5IGFuIGluc3RhbGwgb2YgYSBuZXcgdmVyc2lvbi4KLWZhY2V0QWxyZWFkeUluc3RhbGxlZCA9IENhbm5vdCBpbnN0YWxsIHByb2plY3QgZmFjZXQgezB9IHsxfS4gU29tZSB2ZXJzaW9uIG9mIHRoaXMgcHJvamVjdCBmYWNldCBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLWNhbm5vdFVuaW5zdGFsbCA9IENhbm5vdCB1bmluc3RhbGwgcHJvamVjdCBmYWNldCB7MH0gezF9IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIGluc3RhbGxlZC4KLWNhbm5vdENoYW5nZVZlcnNpb24gPSBDYW5ub3QgY2hhbmdlIHZlcnNpb24gb2YgcHJvamVjdCBmYWNldCB7MH0gdG8gezF9IGJlY2F1c2Ugbm8gdmVyc2lvbiBvZiB0aGlzIHByb2plY3QgZmFjZXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4MjFiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgY29uZmlndXJlZCBpbnN0YW5jZSBvZiBhIHJ1bnRpbWUuIEEgcnVudGltZSBpbnN0YW5jZSBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSAKLSAqIHJ1bnRpbWUgY29tcG9uZW50cy4gCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBvdXRzaWRlIG9mIHRoaXMgZnJhbWV3b3JrLiBDbGllbnQgY29kZSBjYW4gCi0gKiBnZXQgYWNjZXNzIHRvIDxjb2RlPklSdW50aW1lPC9jb2RlPiBvYmplY3RzIGJ5IHVzaW5nIG1ldGhvZHMgb24gdGhlIHtAbGluayBSdW50aW1lTWFuYWdlcn0gCi0gKiBjbGFzcy48L3A+ICAKLSAqIAotICogQHNlZSBSdW50aW1lTWFuYWdlciNnZXRSdW50aW1lcygpCi0gKiBAc2VlIFJ1bnRpbWVNYW5hZ2VyI2dldFJ1bnRpbWUoU3RyaW5nKQotICogQHNlZSBSdW50aW1lTWFuYWdlciNpc1J1bnRpbWVEZWZpbmVkKFN0cmluZykKLSAqIEBzZWUgUnVudGltZU1hbmFnZXIjZGVmaW5lUnVudGltZShTdHJpbmcsTGlzdCxNYXApCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lCi0KLSAgICBleHRlbmRzIElBZGFwdGFibGUKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcnVudGltZS4gVGhlIHJ1bnRpbWUgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3b3Jrc3BhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHJ1bnRpbWUKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIG5hbWUKLSAgICAgKiBvZiB0aGUgcnVudGltZSBhcyByZXR1cm5lZCBieSB0aGUge0BsaW5rICNnZXROYW1lKCl9IG1ldGhvZC4gCi0gICAgICogCi0gICAgICogPHA+VGhlIGxvY2FsaXplZCBuYW1lIHNob3VsZCBiZSB1c2VkIGluIGFsbCBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSB1c2VyIHdoaWxlIGFsbCBtZXRhZGF0YSAKLSAgICAgKiByZWZlcmVuY2VzIHRvIHRoZSBydW50aW1lIHNob3VsZCB1c2UgdGhlIHVubG9jYWxpemVkIG5hbWUuIE5vdGUgdGhhdCB0aGVyZSBpcyBhbiBpbmhlcmVudCAKLSAgICAgKiBkYW5nZXIgaW4gdGhpcy4gSWYgYSBydW50aW1lIGlzIGRlbGV0ZWQgb3IgcmVuYW1lZCwgZXhpc3RpbmcgcHJvamVjdHMgdGhhdCB1c2UgdGhhdCBydW50aW1lIAotICAgICAqIG1pZ2h0IGJlY29tZSBpbnZhbGlkLiBJbiB0aGF0IGNhc2UgdGhlIHN5c3RlbSB3aWxsIG5lZWQgdG8gY29tbXVuaWNhdGUgdGhhdCBwcm9ibGVtIHRvIHRoZSAKLSAgICAgKiB1c2VyIHVzaW5nIHRoZSB1bmxvY2FsaXplZCBuYW1lIGZvciB0aGUgcnVudGltZS4gU2luY2UgdGhlIHVzZXIgaXMgbmV2ZXIgZXhwb3NlZCB0byBydW50aW1lJ3MgCi0gICAgICogdW5sb2NhbGl6ZWQgbmFtZSwgdGhlIHVzZXIgY2FuIGhhdmUgdHJvdWJsZSB1bmRlcnN0YW5kaW5nIGFuZCBjb3JyZWN0aW5nIHRoZSBwcm9ibGVtLiBBCi0gICAgICogc2ltaWxhciBzaXR1YXRpb24gY2FuIGFyaXNlIHdoZW4gYSBwcm9qZWN0IGlzIGltcG9ydGVkIGludG8gYW5vdGhlciB1c2VyJ3Mgd29ya3NwYWNlLjwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD5UbyBtaXRpZ2F0ZSB0aGUgYWJvdmUgcmlza3MsIHRoZSBuYW1lIGxvY2FsaXphdGlvbiBmZWF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgCi0gICAgICogc3BhcmluZ2x5IGFuZCBvbmx5IGluIGNvbnRleHRzIHdoZXJlIHRoZSBydW50aW1lIHByb3ZpZGVyIGNhbiB0YWtlIHN0ZXBzIHRvIGd1YXJhbnRlZSB0aGF0Ci0gICAgICogdGhlIGFib3ZlIHNpdHVhdGlvbiBpcyBub3QgbGlrZWx5IHRvIG9jY3VyLiBPbmUgc2NlbmFyaW8gd2hlcmUgbmFtZSBsb2NhbGl6YXRpb24gaXMKLSAgICAgKiBhY2NlcHRhYmxlIGlzIHdoZW4gYSBydW50aW1lIGlzIGF1dG8tY3JlYXRlZCBhbmQgdGhlIHVzZXIgaXMgbm90IGdpdmVuIGFiaWxpdHkgdG8gZGVsZXRlIG9yCi0gICAgICogcmVuYW1lIGl0LjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHJ1bnRpbWUKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0TG9jYWxpemVkTmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBvdGhlciBuYW1lcyAoaWYgYW55KSB0aGF0IHRoaXMgcnVudGltZSBtYXkgYmUga25vd24gYnkuIFRoZSBsb2NhbGl6ZWQKLSAgICAgKiBuYW1lIChpZiBzcGVjaWZpZWQpIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgYWx0ZXJuYXRlIG5hbWVzIHNldC4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGFsdGVybmF0ZSBuYW1lcyBmb3IgdGhpcyBydW50aW1lIG9yIGFuIGVtcHR5IHNldAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8U3RyaW5nPiBnZXRBbHRlcm5hdGVOYW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY29tcG9uZW50cyB0aGF0IGNvbXByaXNlIHRoaXMgcnVudGltZS4gTm90ZSB0aGF0IHRoZQotICAgICAqIG9yZGVyIGlzIGltcG9ydGFudCBzaW5jZSBmb3Igc29tZSBvcGVyYXRpb25zIGNvbXBvbmVudHMgYXJlIGNvbnNvbHV0ZWQKLSAgICAgKiBpbiBvcmRlciBhbmQgdGhlIGZpcnN0IG9uZSBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgdGhlIG9wZWF0aW9uIHdpbnMuCi0gICAgICogIAotICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgY29tcG9uZW50cyB0aGF0IGNvbXByaXNlIHRoaXMgcnVudGltZQotICAgICAqLwotICAgIAotICAgIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldFJ1bnRpbWVDb21wb25lbnRzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lIGNvbXBvbmVudC4gVGhlCi0gICAgICogY29udGVudHMgd2lsbCB2YXJ5IGRlcGVuZGVuZGluZyBvbiBob3cgdGhlIHJ1bnRpbWUgd2FzIGNyZWF0ZWQgYW5kIHdoYXQKLSAgICAgKiBjb21wb25lbnQgdHlwZXMvdmVyc2lvbnMgaXQncyBjb21wcmlzZWQgb2YuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lCi0gICAgICovCi0gICAgCi0gICAgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb3BlcnRpZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGdldFByb3BlcnR5KCBTdHJpbmcgbmFtZSApOwotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIHJ1bnRpbWUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZhY2V0LgotICAgICAqIFRoZSBydW50aW1lIHN1cHBvcnRzIGEgcHJvamVjdCBmYWNldCBpZiBhbnkgb2YgaXQncyBjb21wb25lbnRzIHN1cHBvcnQKLSAgICAgKiB0aGUgcHJvamVjdCBmYWNldC4gVGhlIHN1cHBvcnQgbWFwcGluZ3MgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUKLSAgICAgKiA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lPC9jb2RlPiBleHRlbnNpb24KLSAgICAgKiBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnYgdGhlIHByb2plY3QgZmFjZXQgdmVyc2lvbgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgZmFjZXQsCi0gICAgICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgCi0gICAgYm9vbGVhbiBzdXBwb3J0cyggSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgICAKLSAgICBib29sZWFuIHN1cHBvcnRzKCBJUHJvamVjdEZhY2V0IGYgKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYWNldHMgKGFuZCB0aGUgdmVyc2lvbnMpIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgCi0gICAgICogd2hlbiB0aGlzIHJ1bnRpbWUgaXMgc2VsZWN0ZWQuIFRoaXMgaW5mb3JtYXRpb24gaXMgZHJhd24gZnJvbSB3aGF0J3MKLSAgICAgKiBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0czwvY29kZT4KLSAgICAgKiBleHRlbnNpb24gcG9pbnQuIFRoZSByZXR1cm5lZCBsaXN0IGlzIGZpbHRlcmVkIGJ5IHJlbW92aW5nIGZhY2V0cyB0aGF0Ci0gICAgICogd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGZpeGVkIGZhY2V0cy4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCAKLSAgICAgKiBzZXQgd2lsbCBhbHdheXMgaW5jbHVkZSB0aGUgZml4ZWQgZmFjZXRzLiBJZiB0aGUgZGVmYXVsdCB2ZXJzaW9uIGZvciBhbnkgCi0gICAgICogZml4ZWQgZmFjZXQgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIHRocm91Z2ggdGhlIGFib3ZlIGV4dGVuc2lvbiAKLSAgICAgKiBwb2ludCwgdGhlIGxhdGVzdCB2ZXJzaW9uIHdpbGwgYmUgdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZml4ZWQgdGhlIGZpeGVkIGZhY2V0cwotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZmFjZXRzCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGZhaWxlZCBmb3IgYW55IHJlYXNvbgotICAgICAqIEBkZXByZWNhdGVkIHVzZSBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weS5nZXREZWZhdWx0Q29uZmlndXJhdGlvbigpIGluc3RlYWQKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldERlZmF1bHRGYWNldHMoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0PiBmaXhlZCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgbnVtYmVyIG9mIHJ1bnRpbWUtc3BlY2lmaWMgY2hlY2tzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgcnVudGltZQotICAgICAqIGluc3RhbmNlIGlzIHZhbGlkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB1c2VkIGZvciBnZXR0aW5nIHByb2dyZXNzIGluZm9ybWF0aW9uIGFuZCBjYW5jZWxpbmcgdmFsaWRhdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB2YWxpZGF0aW9uCi0gICAgICogQHNpbmNlIDMuMAotICAgICAqLwotICAgIAotICAgIElTdGF0dXMgdmFsaWRhdGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9JUnVudGltZUJyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9JUnVudGltZUJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGI1YWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgZXh0ZW5zaW9ucyB3aXNoaW5nIHRvIGV4cG9zZSBydW50aW1lcyBkZWZpbmVkCi0gKiB0aHJvdWdoIG90aGVyIG1lYW5zIHRvIHRoZSBwcm9qZWN0IGZhY2V0cyBmcmFtZXdvcmsuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVCcmlkZ2UKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgbmFtZXMgZm9yIHJ1bnRpbWVzIHRoYXQgdGhpcyBicmlkZ2Ugd2FudHMgdG8gZXhwb3J0LgotICAgICAqIFRoZSBzeXN0ZW0gd2lsbCB0cnkgdG8gYWNjb21tb2RhdGUgdGhlc2UgbmFtZSBjaG9pY2VzLCBidXQgbWF5IGhhdmUgdG8KLSAgICAgKiBkaXNhbWJpZ3VhdGUgbmFtZXMgZHVlIHRvIGNvbGxpc2lvbnMuIEhvd2V2ZXIsIGV2ZW4gaWYgdGhlIHJ1bnRpbWUgbmFtZQotICAgICAqIGlzIGNoYW5nZWQsIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSBwYXNzZWQgaW50byB0aGUge0BsaW5rICNicmlkZ2UoU3RyaW5nKX0KLSAgICAgKiBjYWxsIHdpbGwgYmUgdGhlIG9yaWdpbmFsIG5hbWUgcHJvdmlkZWQgYnkgdGhpcyBtZXRob2QgY2FsbC4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIG5hbWVzIGZvciBydW50aW1lcyB0aGF0IHRoaXMgYnJpZGdlIHdhbnRzIHRvIGV4cG9ydAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgYnJpZGdpbmcKLSAgICAgKi8KLSAgICAKLSAgICBTZXQ8U3RyaW5nPiBnZXRFeHBvcnRlZFJ1bnRpbWVOYW1lcygpCi0gICAgICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3R1YiB0aGF0IHJlcHJlc2VudHMgdGhlIGJyaWRnZWQgcnVudGltZS4gVGhlIHN5c3RlbSB3aWxsCi0gICAgICogd3JhcCB0aGlzIHN0dWIgYW5kIGV4cG9zZSBpdCB0byB0aGUgY2xpZW50cyB0aHJvdWdoIHRoZSB7QGxpbmsgSVJ1bnRpbWV9Ci0gICAgICogaW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBicmlkZ2VkIHJ1bnRpbWUgKGFzIHJldHVybmVkIGJ5IHRoZQotICAgICAqICAge0BsaW5rICNnZXRFeHBvcnRlZFJ1bnRpbWVOYW1lcygpfSkgbWV0aG9kCi0gICAgICogQHJldHVybiBhIHN0dWIgdGhhdCByZXByZXNlbnRzIHRoZSBicmlkZ2VkIHJ1bnRpbWUKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgZmFpbGVkIHdoaWxlIGJyaWRnaW5nCi0gICAgICovCi0gICAgCi0gICAgSVN0dWIgYnJpZGdlKCBTdHJpbmcgbmFtZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgYSBzaW5nbGUgYnJpZGdlZCBydW50aW1lLiBUaGUgc3lzdGVtIHdpbGwgd3JhcCB0aGlzIGludGVyZmFjZQotICAgICAqIGFuZCBleHBvc2UgaXQgdG8gY2xpZW50cyBhcyB7QGxpbmsgSVJ1bnRpbWV9LiBBbGwgcmVsZXZhbnQgY2FsbHMgd2lsbCBiZQotICAgICAqIGRlbGVnYXRlZCB0byB0aGlzIGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgSVN0dWIKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudHMgdGhhdCBjb21wcmlzZSB0aGlzIHJ1bnRpbWUuIE5vdGUgdGhhdCAKLSAgICAgICAgICogdGhlIG9yZGVyIGlzIGltcG9ydGFudCBzaW5jZSBmb3Igc29tZSBvcGVyYXRpb25zIGNvbXBvbmVudHMgYXJlIAotICAgICAgICAgKiBjb25zdWx0ZWQgaW4gb3JkZXIgYW5kIHRoZSBmaXJzdCBvbmUgY2FwYWJsZSBvZiBwZXJmb3JtaW5nIHRoZQotICAgICAgICAgKiBvcGVyYXRpb24gd2lucy4KLSAgICAgICAgICogIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNvbXBvbmVudHMgdGhhdCBjb21wcmlzZSB0aGlzIHJ1bnRpbWUKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cygpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZSBjb21wb25lbnQuIFRoZQotICAgICAgICAgKiBjb250ZW50cyB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyB0aGUgcnVudGltZSB3YXMgY3JlYXRlZCBhbmQgCi0gICAgICAgICAqIHdoYXQgY29tcG9uZW50IHR5cGVzL3ZlcnNpb25zIGl0J3MgY29tcHJpc2VkIG9mLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb3BlcnRpZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhIHNpbmdsZSBicmlkZ2VkIHJ1bnRpbWUuIFRoZSBzeXN0ZW0gd2lsbCB3cmFwIHRoaXMgaW50ZXJmYWNlCi0gICAgICogYW5kIGV4cG9zZSBpdCB0byBjbGllbnRzIGFzIHtAbGluayBJUnVudGltZX0uIEFsbCByZWxldmFudCBjYWxscyB3aWxsIGJlCi0gICAgICogZGVsZWdhdGVkIHRvIHRoaXMgaW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHViCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSVN0dWIKLSAgICAgICAgCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcnVudGltZSBjb21wb25lbnRzIHRoYXQgY29tcHJpc2UgdGhpcyBydW50aW1lLiBOb3RlIHRoYXQgCi0gICAgICAgICAqIHRoZSBvcmRlciBpcyBpbXBvcnRhbnQgc2luY2UgZm9yIHNvbWUgb3BlcmF0aW9ucyBjb21wb25lbnRzIGFyZSAKLSAgICAgICAgICogY29uc3VsdGVkIGluIG9yZGVyIGFuZCB0aGUgZmlyc3Qgb25lIGNhcGFibGUgb2YgcGVyZm9ybWluZyB0aGUKLSAgICAgICAgICogb3BlcmF0aW9uIHdpbnMuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQHJldHVybiB0aGUgcnVudGltZSBjb21wb25lbnRzIHRoYXQgY29tcHJpc2UgdGhpcyBydW50aW1lCi0gICAgICAgICAqIEBzaW5jZSAzLjAKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoKTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJ1bnRpbWUgY29tcG9uZW50LiBUaGUKLSAgICAgICAgICogY29udGVudHMgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgdGhlIHJ1bnRpbWUgd2FzIGNyZWF0ZWQgYW5kIAotICAgICAgICAgKiB3aGF0IGNvbXBvbmVudCB0eXBlcy92ZXJzaW9ucyBpdCdzIGNvbXByaXNlZCBvZi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZQotICAgICAgICAgKiBAc2luY2UgMy4wCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljIGFic3RyYWN0IE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCk7Ci0gCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAc2luY2UgMy4wCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9JUnVudGltZUNvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9JUnVudGltZUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjkyYzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgY29uZmlndXJlZCBpbnN0YW5jZSBvZiBhIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgYW5kIHZlcnNpb24uIEEgcnVudGltZSBpbnN0YW5jZSBpcyAKLSAqIGNvbXBvc2VkIG9mIG11bHRpcGxlIHJ1bnRpbWUgY29tcG9uZW50cy4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIG91dHNpZGUgb2YgdGhpcyBmcmFtZXdvcmsuIENsaWVudCBjb2RlIGNhbiAKLSAqIGdldCBhY2Nlc3MgdG8gPGNvZGU+SVJ1bnRpbWVDb21wb25lbnQ8L2NvZGU+IG9iamVjdHMgYnkgdXNpbmcgbWV0aG9kcyBvbiB0aGUgCi0gKiB7QGxpbmsgSVJ1bnRpbWV9IGFuZCB7QGxpbmsgUnVudGltZU1hbmFnZXJ9IGNsYXNzZXMuPC9wPiAgCi0gKiAKLSAqIEBzZWUgSVJ1bnRpbWUjZ2V0UnVudGltZUNvbXBvbmVudHMoKQotICogQHNlZSBSdW50aW1lTWFuYWdlciNjcmVhdGVSdW50aW1lQ29tcG9uZW50KElSdW50aW1lQ29tcG9uZW50VmVyc2lvbixNYXApIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUNvbXBvbmVudAotCi0gICAgZXh0ZW5kcyBJQWRhcHRhYmxlCi0gICAgCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSBjb21wb25lbnQgdHlwZSB0aGF0IHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcnVudGltZSBjb21wb25lbnQgdHlwZSB0aGF0IHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZUNvbXBvbmVudFR5cGUgZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uIHRoYXQgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uIHRoYXQgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZgotICAgICAqLwotICAgIAotICAgIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBnZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgdGhhdCB0aGlzIGNvbXBvbmVudCBiZWxvbmdzIHRvIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgY29tcG9uZW50Ci0gICAgICogaGFzIG5vdCB5ZXQgYmVlbiBhc3NvY2lhdGVkIHdpdGggYSBydW50aW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdGhhdCB0aGF0IHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8KLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZSBnZXRSdW50aW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW50aW1lIGNvbXBvbmVudC4gVGhlCi0gICAgICogY29udGVudHMgd2lsbCB2YXJ5IGRlcGVuZGVuZGluZyBvbiB0aGUgY29tcG9uZW50IHR5cGUvdmVyc2lvbiwgYnV0IAotICAgICAqIHVzdWFsbHkgdGhpcyB3aWxsIGF0IGxlYXN0IGNvbnRhaW4gdGhlIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9uIGRpc2sgd2hlcmUgCi0gICAgICogdGhlIHJ1bnRpbWUgaXMgaW5zdGFsbGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZSBjb21wb25lbnQKLSAgICAgKi8KLSAgICAKLSAgICBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvcGVydGllcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0UHJvcGVydHkoIFN0cmluZyBuYW1lICk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lQ29tcG9uZW50VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9JUnVudGltZUNvbXBvbmVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwYzUwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lQ29tcG9uZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3I7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBhIHJ1bnRpbWUgY29tcG9uZW50LiBBIHJ1bnRpbWUgaW5zdGFuY2UgaXMgY29tcG9zZWQgb2YgIG11bHRpcGxlIHJ1bnRpbWUgCi0gKiBjb21wb25lbnRzLCBlYWNoIG9mIHdoaWNoIGhhcyBhIHR5cGUgYW5kIGEgdmVyc2lvbi4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIG91dHNpZGUgb2YgdGhpcyBmcmFtZXdvcmsuIFJ1bnRpbWUgY29tcG9uZW50Ci0gKiB0eXBlcyBhcmUgZGVjbGFyZWQgdXNpbmcgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXM8L2NvZGU+Ci0gKiBleHRlbnNpb24gcG9pbnQuIE9uY2UgZGVjbGFyZWQsIGNsaWVudCBjb2RlIGNhbiBnZXQgYWNjZXNzIHRvIDxjb2RlPklSdW50aW1lQ29tcG9uZW50VHlwZTwvY29kZT4gCi0gKiBvYmplY3RzIGJ5IHVzaW5nIG1ldGhvZHMgb24gdGhlIHtAbGluayBSdW50aW1lTWFuYWdlcn0gY2xhc3MuPC9wPiAgCi0gKgotICogQHNlZSBSdW50aW1lTWFuYWdlciNnZXRSdW50aW1lQ29tcG9uZW50VHlwZXMoKQotICogQHNlZSBSdW50aW1lTWFuYWdlciNnZXRSdW50aW1lQ29tcG9uZW50VHlwZShTdHJpbmcpCi0gKiBAc2VlIFJ1bnRpbWVNYW5hZ2VyI2lzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKFN0cmluZykKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVDb21wb25lbnRUeXBlCi0KLSAgICBleHRlbmRzIElBZGFwdGFibGUKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIGlkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgaWQKLSAgICAgKi8KLSAgICAKLSAgICBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4gaWQgb2Ygd2hlcmUgdGhpcyBydW50aW1lIGNvbXBvbmVudCB0eXBlIGlzIGRlZmluZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGx1Z2luIGlkIG9mIHdoZXJlIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZSBpcyBkZWZpbmVkCi0gICAgICovCi0gICAgCi0gICAgU3RyaW5nIGdldFBsdWdpbklkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgb2YgdGhlIHZlcnNpb25zIG9mIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFsbCBvZiB0aGUgdmVyc2lvbnMgb2YgdGhpcyBydW50aW1lIGNvbXBvbmVudCB0eXBlCi0gICAgICovCi0gICAgCi0gICAgU2V0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gZ2V0VmVyc2lvbnMoKTsKLSAgICAKLSAgICBTZXQ8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiBnZXRWZXJzaW9ucyggU3RyaW5nIGV4cHIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIG9mIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZQotICAgICAqIGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiBleGlzdHMsIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIGJvb2xlYW4gaGFzVmVyc2lvbiggU3RyaW5nIHZlcnNpb24gKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9ufSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAgKiBwcm92aWRlZCB2ZXJzaW9uIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9ufSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAgKiAgIHByb3ZpZGVkIHZlcnNpb24gc3RyaW5nCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZlcnNpb24gZG9lcyBub3QgZXhpc3QKLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gZ2V0VmVyc2lvbiggU3RyaW5nIHZlcnNpb24gKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHJ1bnRpbWUgY29tcG9uZW50IGFzIHNwZWNpZmllZCBieSB0aGUgCi0gICAgICogdmVyc2lvbiBjb21wYXJhdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBydW50aW1lIGNvbXBvbmVudAotICAgICAqLwotCi0gICAgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIGdldExhdGVzdFZlcnNpb24oKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc29ydGVkIGxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHZlcnNpb25zIG9mIHRoaXMgcnVudGltZQotICAgICAqIGNvbXBvbmVudCB0eXBlLiBUaGUgc29ydCBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3IuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBhc2NlbmRpbmcgd2hldGhlciB2ZXJzaW9ucyBzaG91bGQgYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlcgotICAgICAqIEByZXR1cm4gYSBzb3J0ZWQgbGlzdCBjb250YWluaW5nIGFsbCBvZiB0aGUgdmVyc2lvbnMgb2YgdGhpcyBydW50aW1lIAotICAgICAqICAgY29tcG9uZW50IHR5cGUKLSAgICAgKi8KLSAgICAKLSAgICBMaXN0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gZ2V0U29ydGVkVmVyc2lvbnMoIGJvb2xlYW4gYXNjZW5kaW5nICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBjb21wYXJhdG9yIHNwZWNpZmllZCBmb3IgdGhpcyBydW50aW1lIGNvbXBvbmVudCB0eXBlLgotICAgICAqIElmIG5vIHZlcnNpb24gY29tcGFyYXRvciBpcyBzcGVjaWZpZWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIAotICAgICAqIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3Igc3BlY2lmaWVkIGZvciB0aGlzIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUKLSAgICAgKi8KLSAgICAKLSAgICBDb21wYXJhdG9yPFN0cmluZz4gZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL0lSdW50aW1lQ29tcG9uZW50VmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVkNzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbjsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgdmVyc2lvbiBvZiBhIHJ1bnRpbWUgY29tcG9uZW50LiBBIHJ1bnRpbWUgaW5zdGFuY2UgaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgcnVudGltZSAKLSAqIGNvbXBvbmVudHMsIGVhY2ggb2Ygd2hpY2ggaGFzIGEgdHlwZSBhbmQgYSB2ZXJzaW9uLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgb3V0c2lkZSBvZiB0aGlzIGZyYW1ld29yay4gUnVudGltZSBjb21wb25lbnQKLSAqIHZlcnNpb25zIGFyZSBkZWNsYXJlZCB1c2luZyA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lczwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4gT25jZSBkZWNsYXJlZCwgY2xpZW50IGNvZGUgY2FuIGdldCBhY2Nlc3MgdG8gCi0gKiA8Y29kZT5JUnVudGltZUNvbXBvbmVudFZlcnNpb248L2NvZGU+IG9iamVjdHMgYnkgdXNpbmcgbWV0aG9kcyBvbiB0aGUgCi0gKiB7QGxpbmsgSVJ1bnRpbWVDb21wb25lbnRUeXBlfSBjbGFzcy48L3A+ICAKLSAqCi0gKiBAc2VlIElSdW50aW1lQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9ucygpCi0gKiBAc2VlIElSdW50aW1lQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9ucyhTdHJpbmcpCi0gKiBAc2VlIElSdW50aW1lQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9uKFN0cmluZykKLSAqIEBzZWUgSVJ1bnRpbWVDb21wb25lbnRUeXBlI2hhc1ZlcnNpb24oU3RyaW5nKQotICogQHNlZSBJUnVudGltZUNvbXBvbmVudFR5cGUjZ2V0TGF0ZXN0VmVyc2lvbigpCi0gKiBAc2VlIElSdW50aW1lQ29tcG9uZW50VHlwZSNnZXRTb3J0ZWRWZXJzaW9ucyhib29sZWFuKQotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUNvbXBvbmVudFZlcnNpb24KLQotICAgIGV4dGVuZHMgQ29tcGFyYWJsZSwgSVZlcnNpb24sIElBZGFwdGFibGUKLSAgICAKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIHRoYXQgdGhpcyBpcyBhIHZlcnNpb24gb2YuCi0gICAgICogCi0gICAgICogQHJldHVybiByZXR1cm5zIHRoZSBydW50aW1lIGNvbXBvbmVudCB0eXBlIHRoYXQgdGhpcyBpcyBhIHZlcnNpb24gb2YKLSAgICAgKi8KLSAgICAKLSAgICBJUnVudGltZUNvbXBvbmVudFR5cGUgZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIHN0cmluZwotICAgICAqLwotICAgIAotICAgIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL1J1bnRpbWVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL1J1bnRpbWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTg4ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9SdW50aW1lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5JUnVudGltZUxpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbC5SdW50aW1lTWFuYWdlckltcGw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVNYW5hZ2VyIAotewotICAgIHByaXZhdGUgUnVudGltZU1hbmFnZXIoKSB7fQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBhdmFpbGFibGUgcnVudGltZSBjb21wb25lbnQgdHlwZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbGwgb2YgdGhlIGF2YWlsYWJsZSBydW50aW1lIGNvbXBvbmVudCB0eXBlcwotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElSdW50aW1lQ29tcG9uZW50VHlwZT4gZ2V0UnVudGltZUNvbXBvbmVudFR5cGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZUNvbXBvbmVudFR5cGVzKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgZXhpc3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgcnVudGltZSBjb21wb25lbnQgdHlwZSBpZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBydW50aW1lIGNvbXBvbmVudCB0eXBlIGV4aXN0cywKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lQ29tcG9uZW50VHlwZURlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gUnVudGltZU1hbmFnZXJJbXBsLmlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKCBpZCApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSVJ1bnRpbWVDb21wb25lbnRUeXBlfSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgcnVudGltZSBjb21wb25lbnQgdHlwZSBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbWUgY29tcG9uZW5ldCB0eXBlIGlkCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIElSdW50aW1lQ29tcG9uZW50VHlwZX0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogICBzcGVjaWZpZWQgcnVudGltZSBjb21wb25lbmV0IHR5cGUgaWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcnVudGltZSBjb21wb25lbnQgdHlwZSBpZCBpcyBub3QKLSAgICAgKiAgIHJlY29nbml6ZWQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lQ29tcG9uZW50VHlwZSBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoIGlkICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIG9mIHRoZSBkZWZpbmVkIHJ1bnRpbWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSBkZWZpbmVkIHJ1bnRpbWVzCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8SVJ1bnRpbWU+IGdldFJ1bnRpbWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZXMgdGhhdCBzdXBwb3J0IGFsbCBvZiB0aGUgc3BlY2lmaWVkIGZhY2V0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXRzIHRoZSBmYWNldHMgdGhhdCBuZWVkIHRvIGJlIHN1cHBvcnRlZAotICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWVzIHRoYXQgc3VwcG9ydCBhbGwgb2YgdGhlIHNwZWNpZmllZCBmYWNldHMKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJUnVudGltZT4gZ2V0UnVudGltZXMoIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZXMoIGZhY2V0cyApOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBydW50aW1lIGhhcyBiZWVuIGRlZmluZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHJ1bnRpbWUgbmFtZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBydW50aW1lIGlzIGRlZmluZWQsIAotICAgICAqICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWVEZWZpbmVkKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gUnVudGltZU1hbmFnZXJJbXBsLmlzUnVudGltZURlZmluZWQoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcnVudGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcnVudGltZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgcnVudGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgbmFtZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBydW50aW1lIG5hbWUgaXMgbm90IHJlY29nbml6ZWQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGdldFJ1bnRpbWUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZ2V0UnVudGltZSggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIGEgbmV3IHJ1bnRpbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHJ1bnRpbWUgbmFtZQotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBsaXN0IG9mIHJ1bnRpbWUgY29tcG9uZW5ldHMKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcnVudGltZSBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybiB0aGUgbmV3IHJ1bnRpbWUKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGRlZmluZVJ1bnRpbWUoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlckltcGwuZGVmaW5lUnVudGltZSggbmFtZSwgY29tcG9uZW50cywgcHJvcGVydGllcyApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoZSBydW50aW1lIGZyb20gdGhlIHJlZ2lzdHJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIGRlbGV0ZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVSdW50aW1lKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIFJ1bnRpbWVNYW5hZ2VySW1wbC5kZWxldGVSdW50aW1lKCBydW50aW1lICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjb21wb25lbmV0LiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluCi0gICAgICogY29uanVuY3Rpb24gd2l0aCB0aGUge0BsaW5rICNkZWZpbmVSdW50aW1lKFN0cmluZyxMaXN0LE1hcCl9IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmN2IHRoZSBydW50aW1lIGNvbXBvbmVudCB2ZXJzaW9uCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIHJ1bnRpbWUgY29tcG9uZW50IHByb3BlcnRpZXMKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcnVudGltZSBjb21wb25lbnQKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lQ29tcG9uZW50IGNyZWF0ZVJ1bnRpbWVDb21wb25lbnQoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gcHJvcGVydGllcyApCi0gICAgewotICAgICAgICByZXR1cm4gUnVudGltZU1hbmFnZXJJbXBsLmNyZWF0ZVJ1bnRpbWVDb21wb25lbnQoIHJjdiwgcHJvcGVydGllcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUnVudGltZUxpc3RlbmVyKCBmaW5hbCBJTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgUnVudGltZU1hbmFnZXJJbXBsLmFkZFJ1bnRpbWVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUnVudGltZUxpc3RlbmVyKCBmaW5hbCBJTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgUnVudGltZU1hbmFnZXJJbXBsLnJlbW92ZVJ1bnRpbWVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIFJ1bnRpbWVNYW5hZ2VySW1wbC5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBSdW50aW1lTWFuYWdlckltcGwucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGY3ODFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL0lSdW50aW1lTGlmZWN5Y2xlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi0vKioKLSAqIFRoZSByb290IGludGVyZmFjZSBvZiBhbGwgcnVudGltZSBsaWZlY3ljbGUgZXZlbnRzLiAKLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJUnVudGltZUxpZmVjeWNsZUV2ZW50Ci17Ci0gICAgZW51bSBUeXBlCi0gICAgewotICAgICAgICBWQUxJREFUSU9OX1NUQVRVU19DSEFOR0VECi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBldmVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgZXZlbnQKLSAgICAgKi8KLSAgICAKLSAgICBUeXBlIGdldFR5cGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgYWZmZWN0ZWQgcnVudGltZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhZmZlY3RlZCBydW50aW1lCi0gICAgICovCi0gICAgCi0gICAgSVJ1bnRpbWUgZ2V0UnVudGltZSgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjA3YWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50czsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byBub3RpZnkgdGhlIGxpc3RlbmVyIHRoYXQgYW4gZXZlbnQgaGFzIG9jY3VycmVkLgotICAgICAqIAotICAgICAqIDxwPkl0IGlzIGhpZ2hseSBhZHZpc2VkIHRoYXQgYW55IGxpc3RlbmVyIHRoYXQgcGVyZm9ybXMgbm9uLWNyaXRpY2FsIG9yIGxvbmctcnVubmluZyB0YXNrcyAKLSAgICAgKiB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgaW4gdGhlIGJhY2tncm91bmQgKHN1Y2ggYXMgdXBkYXRpbmcgVUkpIGRvIHNvIGFzeW5jaHJvbm91c2x5IGJ5Ci0gICAgICogc3Bpbm5pbmcgb2ZmIGEgdGhyZWFkLCBzY2hlZHVsaW5nIGEgam9iLCBldGMuIFRoaXMgYWxsb3dzIHRoZSBvcmlnaW5hbCBtb2RpZmljYXRpb24gdG8KLSAgICAgKiBjb21wbGV0ZSBmYXN0ZXIgcmVzdWx0aW5nIGluIGJldHRlciBwZXJjZWl2ZWQgcmVzcG9uc2l2ZW5lc3MuPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGV2ZW50Ci0gICAgICovCi0gICAgCi0gICAgdm9pZCBoYW5kbGVFdmVudCggSVJ1bnRpbWVMaWZlY3ljbGVFdmVudCBldmVudCApOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvSVZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL0lWYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjk5MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvSVZhbGlkYXRpb25TdGF0dXNDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50Ci0KLSAgICBleHRlbmRzIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQKLSAgICAKLXsKLSAgICBJU3RhdHVzIGdldE9sZFZhbGlkYXRpb25TdGF0dXMoKTsKLSAgICAKLSAgICBJU3RhdHVzIGdldE5ld1ZhbGlkYXRpb25TdGF0dXMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL2ludGVybmFsL1J1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9pbnRlcm5hbC9SdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWZlMDM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvZXZlbnRzL2ludGVybmFsL1J1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVJ1bnRpbWVMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeQotewotICAgIHByaXZhdGUgZmluYWwgTWFwPElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZSxTZXQ8SVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcj4+IGxpc3RlbmVyczsKLSAgICAKLSAgICBwdWJsaWMgUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyUmVnaXN0cnkoKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMKLSAgICAgICAgICAgID0gbmV3IEVudW1NYXA8SVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5UeXBlLFNldDxJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyPj4oIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZS5jbGFzcyApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUgdCA6IElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZS52YWx1ZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1dCggdCwgbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcj4oKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgfHwgdHlwZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUgdHlwZSAKLSAgICAgICAgICAgICA6ICggdHlwZXMubGVuZ3RoID4gMCA/IHR5cGVzIDogSVJ1bnRpbWVMaWZlY3ljbGVFdmVudC5UeXBlLnZhbHVlcygpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoIHR5cGUgKS5hZGQoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggU2V0PElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI+IGxpc3RlbmVycyA6IHRoaXMubGlzdGVuZXJzLnZhbHVlcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgZm9yKCBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMuZ2V0KCBldmVudC5nZXRUeXBlKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KCBldmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZSBldmVudFR5cGUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLmdldCggZXZlbnRUeXBlICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9pbnRlcm5hbC9WYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9pbnRlcm5hbC9WYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDU3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9ldmVudHMvaW50ZXJuYWwvVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVJ1bnRpbWVMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5JVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudAotCi0gICAgaW1wbGVtZW50cyBJVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudAotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWUgcnVudGltZTsKLSAgICBwcml2YXRlIGZpbmFsIElTdGF0dXMgb2xkVmFsaWRhdGlvblN0YXR1czsKLSAgICBwcml2YXRlIGZpbmFsIElTdGF0dXMgbmV3VmFsaWRhdGlvblN0YXR1czsKLSAgICAKLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0YXR1c0NoYW5nZWRFdmVudCggZmluYWwgSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBvbGRWYWxpZGF0aW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIG5ld1ZhbGlkYXRpb25TdGF0dXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5ydW50aW1lID0gcnVudGltZTsKLSAgICAgICAgdGhpcy5vbGRWYWxpZGF0aW9uU3RhdHVzID0gb2xkVmFsaWRhdGlvblN0YXR1czsKLSAgICAgICAgdGhpcy5uZXdWYWxpZGF0aW9uU3RhdHVzID0gbmV3VmFsaWRhdGlvblN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJUnVudGltZUxpZmVjeWNsZUV2ZW50LlR5cGUuVkFMSURBVElPTl9TVEFUVVNfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJU3RhdHVzIGdldE9sZFZhbGlkYXRpb25TdGF0dXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub2xkVmFsaWRhdGlvblN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBnZXROZXdWYWxpZGF0aW9uU3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5ld1ZhbGlkYXRpb25TdGF0dXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL0Fic3RyYWN0UnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9BYnN0cmFjdFJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlN2FjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL0Fic3RyYWN0UnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UnVudGltZQotCi0gICAgaW1wbGVtZW50cyBJUnVudGltZQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xPQ0FMSVpFRF9OQU1FID0gImxvY2FsaXplZC1uYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGUgbGlzdCBvZiBuYW1lcyB0aGF0IHRoaXMgcnVudGltZQotICAgICAqIGNhbiBiZSBhbHRlcm5hdGl2ZWx5IGtub3duIGJ5LiBBbnkgY29tbWFzIGluIHRoZSBuYW1lcyBoYXZlIHRvIGJlIGVzY2FwZWQgdXNpbmcgYSBsZWFkaW5nCi0gICAgICogc2xhc2ggY2hhcmFjdGVyICgnXCcpLiAKLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BTFRFUk5BVEVfTkFNRVMgPSAiYWx0ZXJuYXRlLW5hbWVzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHN1YmNsYXNzZWQgb3V0c2lkZSB0aGlzIHBhY2thZ2UuCi0gICAgICovCi0gICAgCi0gICAgQWJzdHJhY3RSdW50aW1lKCkge30KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRMb2NhbGl6ZWROYW1lKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhbGl6ZWROYW1lID0gZ2V0UHJvcGVydHkoIFBST1BfTE9DQUxJWkVEX05BTUUgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBsb2NhbGl6ZWROYW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhbGl6ZWROYW1lID0gZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbG9jYWxpemVkTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFNldDxTdHJpbmc+IGdldEFsdGVybmF0ZU5hbWVzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhbHRlcm5hdGVOYW1lc1Byb3AgPSBnZXRQcm9wZXJ0eSggUFJPUF9BTFRFUk5BVEVfTkFNRVMgKTsKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYWx0ZXJuYXRlTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTmFtZSA9IGdldExvY2FsaXplZE5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIGxvY2FsaXplZE5hbWUuZXF1YWxzKCBnZXROYW1lKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFsdGVybmF0ZU5hbWVzLmFkZCggbG9jYWxpemVkTmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggYWx0ZXJuYXRlTmFtZXNQcm9wICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBib29sZWFuIHNlZW5Fc2NhcGVDaGFyID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gYWx0ZXJuYXRlTmFtZXNQcm9wLmxlbmd0aCgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gYWx0ZXJuYXRlTmFtZXNQcm9wLmNoYXJBdCggaSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBzZWVuRXNjYXBlQ2hhciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggY2ggIT0gJywnICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggJ1xcJyApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBjaCApOwotICAgICAgICAgICAgICAgICAgICBzZWVuRXNjYXBlQ2hhciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggY2ggPT0gJ1xcJyAmJiBpICE9IG4gLSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VlbkVzY2FwZUNoYXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICcsJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gYnVmLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggbmFtZS5sZW5ndGgoKSA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZU5hbWVzLmFkZCggbmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKCAwICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBjaCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggc2VlbkVzY2FwZUNoYXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICdcXCcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBidWYudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBuYW1lLmxlbmd0aCgpID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWx0ZXJuYXRlTmFtZXMuYWRkKCBuYW1lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoIGFsdGVybmF0ZU5hbWVzICk7Ci0gICAgfQotICAgIAotICAgIGZpbmFsIHZvaWQgc2V0TmFtZSggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnR5KCBmaW5hbCBTdHJpbmcga2V5ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKCkuZ2V0KCBrZXkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBDbGFzcyBhZGFwdGVyICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0ID0gYWRhcHRlci5nZXROYW1lKCk7Ci0gICAgICAgIE9iamVjdCByZXMgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKCB0aGlzLCB0ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcmVzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElSdW50aW1lQ29tcG9uZW50IHJjIDogZ2V0UnVudGltZUNvbXBvbmVudHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzID0gcmMuZ2V0QWRhcHRlciggYWRhcHRlciApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCByZXMgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoIGZpbmFsIElQcm9qZWN0RmFjZXQgZiApCi0gICAgewotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXREZWZhdWx0RmFjZXRzKCBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWQgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXQgZiA6IGZpeGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFjZXRzLmFkZCggZi5nZXRMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uKCB0aGlzICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhY2V0czsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgewotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoIGZpbmFsIE9iamVjdCBvYmogKQotICAgIHsKLSAgICAgICAgaWYoIG9iaiBpbnN0YW5jZW9mIElSdW50aW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgciA9IChJUnVudGltZSkgb2JqOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyggci5nZXROYW1lKCkgKSAmJiAKLSAgICAgICAgICAgICAgICAgICBnZXRSdW50aW1lQ29tcG9uZW50cygpLmVxdWFscyggci5nZXRSdW50aW1lQ29tcG9uZW50cygpICkgJiYKLSAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0aWVzKCkuZXF1YWxzKCByLmdldFByb3BlcnRpZXMoKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL0JyaWRnZWRSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL0JyaWRnZWRSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODJlMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9CcmlkZ2VkUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEJyaWRnZWRSdW50aW1lCi0KLSAgICBleHRlbmRzIEFic3RyYWN0UnVudGltZQotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGJyaWRnZUlkOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hdGl2ZVJ1bnRpbWVJZDsKLSAgICBwcml2YXRlIGZpbmFsIElSdW50aW1lQnJpZGdlLklTdHViIHN0dWI7Ci0gICAgcHJpdmF0ZSBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHN1cHBvcnRlZDsKLSAgICBwcml2YXRlIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGNvbXBvc2l0aW9uOwotICAgIAotICAgIEJyaWRnZWRSdW50aW1lKCBmaW5hbCBTdHJpbmcgYnJpZGdlSWQsCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYXRpdmVSdW50aW1lSWQsCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQnJpZGdlLklTdHViIHN0dWIgKQotICAgIHsKLSAgICAgICAgdGhpcy5icmlkZ2VJZCA9IGJyaWRnZUlkOwotICAgICAgICB0aGlzLm5hdGl2ZVJ1bnRpbWVJZCA9IG5hdGl2ZVJ1bnRpbWVJZDsKLSAgICAgICAgdGhpcy5zdHViID0gc3R1YjsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGdldEJyaWRnZUlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJyaWRnZUlkOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgZ2V0TmF0aXZlUnVudGltZUlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVJ1bnRpbWVJZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGdldFJ1bnRpbWVDb21wb25lbnRzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGNvbXBvbmVudHMgPSB0aGlzLnN0dWIuZ2V0UnVudGltZUNvbXBvbmVudHMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnQgcmMgOiBjb21wb25lbnRzICkKLSAgICAgICAgewotICAgICAgICAgICAgKCAoUnVudGltZUNvbXBvbmVudCkgcmMgKS5zZXRSdW50aW1lKCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBjb21wb25lbnRzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCB0aGlzLnN0dWIuZ2V0UHJvcGVydGllcygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN1cHBvcnRzKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICBpZiggZnYuZ2V0UGx1Z2luSWQoKSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGNvbXAgPSBnZXRSdW50aW1lQ29tcG9uZW50cygpOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuc3VwcG9ydGVkID09IG51bGwgfHwgISB0aGlzLmNvbXBvc2l0aW9uLmVxdWFscyggY29tcCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWQgPSBSdW50aW1lTWFuYWdlckltcGwuZ2V0U3VwcG9ydGVkRmFjZXRzKCBjb21wICk7Ci0gICAgICAgICAgICB0aGlzLmNvbXBvc2l0aW9uID0gY29tcDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRoaXMuc3VwcG9ydGVkLmNvbnRhaW5zKCBmdiApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuc3R1YiBpbnN0YW5jZW9mIElSdW50aW1lQnJpZGdlLlN0dWIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCAoSVJ1bnRpbWVCcmlkZ2UuU3R1YikgdGhpcy5zdHViICkudmFsaWRhdGUoIG1vbml0b3IgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci52YWxpZGF0ZSggbW9uaXRvciApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWIzYTdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZQotCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWUKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8SVJ1bnRpbWVDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ29tcG9uZW50PigpOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gY29tcG9uZW50c1JlYWRPbmx5IAotICAgICAgICA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIHRoaXMuY29tcG9uZW50cyApOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IHByb3BlcnRpZXNSZWFkT25seQotICAgICAgICA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCggdGhpcy5wcm9wZXJ0aWVzICk7Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHN1cHBvcnRlZCA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBvdXRzaWRlIHRoaXMgcGFja2FnZS4KLSAgICAgKi8KLSAgICAKLSAgICBSdW50aW1lKCkge30KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gZ2V0UnVudGltZUNvbXBvbmVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50c1JlYWRPbmx5OwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFJ1bnRpbWVDb21wb25lbnQoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IGNvbXBvbmVudCApCi0gICAgewotICAgICAgICAoIChSdW50aW1lQ29tcG9uZW50KSBjb21wb25lbnQgKS5zZXRSdW50aW1lKCB0aGlzICk7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50cy5hZGQoIGNvbXBvbmVudCApOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dCgga2V5LCB2YWx1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdXBwb3J0cyggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgaWYoIGZ2LmdldFBsdWdpbklkKCkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5zdXBwb3J0ZWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkID0gUnVudGltZU1hbmFnZXJJbXBsLmdldFN1cHBvcnRlZEZhY2V0cyggdGhpcy5jb21wb25lbnRzICk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gdGhpcy5zdXBwb3J0ZWQuY29udGFpbnMoIGZ2ICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVlNTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVDb21wb25lbnQKLQotICAgIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnQKLSAgICAKLXsKLSAgICBwcml2YXRlIFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdjsKLSAgICBwcml2YXRlIElSdW50aW1lIHJ1bnRpbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBvdXRzaWRlIHRoaXMgcGFja2FnZS4KLSAgICAgKi8KLQotICAgIFJ1bnRpbWVDb21wb25lbnQoKSAKLSAgICB7Ci0gICAgICAgIHRoaXMucmN2ID0gbnVsbDsKLSAgICAgICAgdGhpcy5ydW50aW1lID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHkgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoIHRoaXMucHJvcGVydGllcyApOwotICAgIH0KLQotICAgIHB1YmxpYyBJUnVudGltZUNvbXBvbmVudFR5cGUgZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmN2LmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBnZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5yY3Y7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgKQotICAgIHsKLSAgICAgICAgdGhpcy5yY3YgPSAoUnVudGltZUNvbXBvbmVudFZlcnNpb24pIHJjdjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRSdW50aW1lKCBmaW5hbCBJUnVudGltZSBydW50aW1lICkKLSAgICB7Ci0gICAgICAgIGlmKCBydW50aW1lID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIFJlc291cmNlcy5ydW50aW1lQWxyZWFkeVNldCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJ1bnRpbWUgPSBydW50aW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvcGVydGllcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzUmVhZE9ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSggZmluYWwgU3RyaW5nIGtleSApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldCgga2V5ICk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoIGtleSwgdmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIENsYXNzIHR5cGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUFkYXB0ZXJNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotICAgICAgICBPYmplY3QgcmVzID0gbWFuYWdlci5sb2FkQWRhcHRlciggdGhpcywgdHlwZS5nZXROYW1lKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCByZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IHRoaXMucmN2LmdldEFkYXB0ZXJGYWN0b3J5KCB0eXBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmYWN0b3J5ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlcyA9IGZhY3RvcnkuZ2V0QWRhcHRlciggdGhpcywgdHlwZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iaiApCi0gICAgewotICAgICAgICBpZiggb2JqIGluc3RhbmNlb2YgUnVudGltZUNvbXBvbmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVDb21wb25lbnQgcmMgPSAoUnVudGltZUNvbXBvbmVudCkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIHRoaXMucmN2ID09IHJjLnJjdiAmJiB0aGlzLnByb3BlcnRpZXMuZXF1YWxzKCByYy5wcm9wZXJ0aWVzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5yY3YuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5yY3YudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lQWxyZWFkeVNldDsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFJ1bnRpbWVDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpLCBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODY0NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1ydW50aW1lQWxyZWFkeVNldCA9IENvbXBvbmVudCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIHJ1bnRpbWUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDA0YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5WZXJzaW9uYWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZUNvbXBvbmVudFR5cGUKLQotICAgIGV4dGVuZHMgVmVyc2lvbmFibGU8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPgotICAgIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnRUeXBlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0SWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldFBsdWdpbklkKCBmaW5hbCBTdHJpbmcgcGx1Z2luICkKLSAgICB7Ci0gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGFkZFZlcnNpb24oIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiB2ZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJzaW9ucy5hZGQoIHZlci5nZXRWZXJzaW9uU3RyaW5nKCksIHZlciApOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlciggZmluYWwgQ2xhc3MgdHlwZSApCi0gICAgewotICAgICAgICByZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlciggdGhpcywgdHlwZS5nZXROYW1lKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVZlcnNpb25Ob3RGb3VuZEVyck1zZyggZmluYWwgU3RyaW5nIHZlcnN0ciApCi0gICAgewotICAgICAgICByZXR1cm4gTkxTLmJpbmQoIFJ1bnRpbWVNYW5hZ2VySW1wbC5SZXNvdXJjZXMucnVudGltZUNvbXBvbmVudFZlcnNpb25Ob3REZWZpbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQsIHZlcnN0ciApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFZlcnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZUNvbXBvbmVudFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxMzg2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuUGx1Z2luVXRpbC5pbnN0YW50aWF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuVW5rbm93blZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5WZXJzaW9uYWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUnVudGltZUNvbXBvbmVudFZlcnNpb24KLQotICAgIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luOwotICAgIHByaXZhdGUgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4oKTsKLSAgICBwcml2YXRlIE1hcDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24sSW50ZWdlcj4gY29tcFRhYmxlID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRQbHVnaW5JZCggZmluYWwgU3RyaW5nIHBsdWdpbiApCi0gICAgewotICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJ1bnRpbWVDb21wb25lbnRUeXBlIGdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0UnVudGltZUNvbXBvbmVudFR5cGUoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSB0eXBlICkKLSAgICB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0VmVyc2lvblN0cmluZyggZmluYWwgU3RyaW5nIHZlcnNpb24gKQotICAgIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFZlcnNpb25hYmxlIGdldFZlcnNpb25hYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVmVyc2lvbmFibGUpIHRoaXMudHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCBmaW5hbCBDbGFzczw/PiB0eXBlICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHRoaXMuYWRhcHRlckZhY3RvcmllcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBmYWN0b3J5ID0gdGhpcy5hZGFwdGVyRmFjdG9yaWVzLmdldCggdHlwZS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZhY3RvcnkgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBmYWN0b3J5IGluc3RhbmNlb2YgUGx1Z2luQW5kQ2xhc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFBsdWdpbkFuZENsYXNzIHJlZiA9IChQbHVnaW5BbmRDbGFzcykgZmFjdG9yeTsKLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gaW5zdGFudGlhdGUoIHJlZi5wbHVnaW4sIHJlZi5jbG5hbWUsIElBZGFwdGVyRmFjdG9yeS5jbGFzcyApOwotICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlckZhY3Rvcmllcy5wdXQoIHR5cGUuZ2V0TmFtZSgpLCBmYWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAoSUFkYXB0ZXJGYWN0b3J5KSBmYWN0b3J5OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgYWRkQWRhcHRlckZhY3RvcnkoIGZpbmFsIFN0cmluZyB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhY3RvcnkgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCB0aGlzLmFkYXB0ZXJGYWN0b3JpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmFkYXB0ZXJGYWN0b3JpZXMucHV0KCB0eXBlLCBuZXcgUGx1Z2luQW5kQ2xhc3MoIHBsdWdpbiwgZmFjdG9yeSApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzZXRDb21wYXJpc29uVGFibGUoIGZpbmFsIE1hcDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24sSW50ZWdlcj4gY29tcFRhYmxlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcFRhYmxlID0gY29tcFRhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKCBmaW5hbCBPYmplY3Qgb2JqICkKLSAgICB7Ci0gICAgICAgIGlmKCBvYmogPT0gdGhpcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9iaiBpbnN0YW5jZW9mIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgPSAoSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKSBvYmo7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCByY3YuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKSAhPSB0aGlzLnR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLmNhbm5vdENvbXBhcmVWZXJzaW9uc09mRGlmZmVyZW50VHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZS5nZXRJZCgpLCB0aGlzLnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjdi5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpLmdldElkKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY3YuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIG1zZyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wVGFibGUuZ2V0KCByY3YgKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9iaiBpbnN0YW5jZW9mIFVua25vd25WZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXAgPSB0aGlzLnR5cGUuZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcC5jb21wYXJlKCB0aGlzLnZlcnNpb24sICggKElWZXJzaW9uKSBvYmogKS5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBDbGFzcyB0eXBlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKCB0aGlzLCB0eXBlLmdldE5hbWUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5nZXRJZCgpICsgIiAiICsgdGhpcy52ZXJzaW9uOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGx1Z2luQW5kQ2xhc3MKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcGx1Z2luOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNsbmFtZTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBQbHVnaW5BbmRDbGFzcyggZmluYWwgU3RyaW5nIHBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xuYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0gICAgICAgICAgICB0aGlzLmNsbmFtZSA9IGNsbmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdENvbXBhcmVWZXJzaW9uc09mRGlmZmVyZW50VHlwZXM7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBSdW50aW1lQ29tcG9uZW50VmVyc2lvbi5jbGFzcy5nZXROYW1lKCksIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkxTLmJpbmQoIHRlbXBsYXRlLCBuZXcgT2JqZWN0W10geyBhcmcxLCBhcmcyLCBhcmczIH0gKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcmc0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5MUy5iaW5kKCB0ZW1wbGF0ZSwgbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCB9ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRWZXJzaW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVDb21wb25lbnRWZXJzaW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODhiMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lQ29tcG9uZW50VmVyc2lvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1jYW5ub3RDb21wYXJlVmVyc2lvbnNPZkRpZmZlcmVudFR5cGVzID0gXAotICBDYW5ub3QgY29tcGFyZSB2ZXJzaW9ucyBvZiBkaWZmZXJlbnQgcnVudGltZSBjb21wb25lbnQgdHlwZXMgdG8gZWFjaCBvdGhlci4gXAotICBBdHRlbXB0ZWQgdG8gY29tcGFyZSB2ZXJzaW9uIHsxfSBvZiBydW50aW1lIGNvbXBvbmVudCB0eXBlIHswfSB3aXRoIHZlcnNpb24gXAotICB7M30gb2YgcnVudGltZSBjb21wb25lbnQgdHlwZSB7Mn0uIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZU1hbmFnZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2ludGVybmFsL1J1bnRpbWVNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjEwMDdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlBsdWdpblV0aWwuaW5zdGFudGlhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5WZXJzaW9uRm9ybWF0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEZyYW1ld29ya0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQ29tcG9uZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLlJ1bnRpbWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuZXZlbnRzLklSdW50aW1lTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5ldmVudHMuSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5pbnRlcm5hbC5SdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cy5pbnRlcm5hbC5WYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuSW5kZXhlZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLlZlcnNpb25FeHByOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lTWFuYWdlckltcGwKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0lEID0gInJ1bnRpbWVzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCUklER0VTX0VYVEVOU0lPTl9JRCA9ICJydW50aW1lQnJpZGdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GQUNFVFNfRVhURU5TSU9OX0lEID0gImRlZmF1bHRGYWNldHMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9BREFQVEVSID0gImFkYXB0ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0JSSURHRSA9ICJicmlkZ2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0RFRkFVTFRfRkFDRVRTID0gImRlZmF1bHQtZmFjZXRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRkFDVE9SWSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9SVU5USU1FX0NPTVBPTkVOVCA9ICJydW50aW1lLWNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUlVOVElNRV9DT01QT05FTlRfVFlQRSA9ICJydW50aW1lLWNvbXBvbmVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9SVU5USU1FX0NPTVBPTkVOVF9WRVJTSU9OID0gInJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1NVUFBPUlRFRCA9ICJzdXBwb3J0ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1ZFUlNJT05fQ09NUEFSQVRPUiA9ICJ2ZXJzaW9uLWNvbXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZID0gImFueSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxJUnVudGltZUNvbXBvbmVudFR5cGU+IHJ1bnRpbWVDb21wb25lbnRUeXBlczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxJUnVudGltZT4gcnVudGltZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxNYXBwaW5nPiBtYXBwaW5nczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLElSdW50aW1lQnJpZGdlPiBicmlkZ2VzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8RGVmYXVsdEZhY2V0c0VudHJ5PiBkZWZhdWx0RmFjZXRzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxJTGlzdGVuZXI+IGxpc3RlbmVyczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeSBydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeTsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIHJ1bnRpbWVDb21wb25lbnRUeXBlcyA9IG5ldyBJbmRleGVkU2V0PFN0cmluZyxJUnVudGltZUNvbXBvbmVudFR5cGU+KCk7Ci0gICAgICAgIHJ1bnRpbWVzID0gbmV3IEluZGV4ZWRTZXQ8U3RyaW5nLElSdW50aW1lPigpOwotICAgICAgICBtYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8TWFwcGluZz4oKTsKLSAgICAgICAgYnJpZGdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJUnVudGltZUJyaWRnZT4oKTsKLSAgICAgICAgZGVmYXVsdEZhY2V0cyA9IG5ldyBBcnJheUxpc3Q8RGVmYXVsdEZhY2V0c0VudHJ5PigpOwotICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgSGFzaFNldDxJTGlzdGVuZXI+KCk7Ci0gICAgICAgIHJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lclJlZ2lzdHJ5ID0gbmV3IFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lclJlZ2lzdHJ5KCk7Ci0gICAgICAgIAotICAgICAgICByZWFkTWV0YWRhdGEoKTsKLSAgICAgICAgcmVhZEJyaWRnZXNFeHRlbnNpb25zKCk7Ci0gICAgICAgIHJlYWREZWZhdWx0RmFjZXRzRXh0ZW5zaW9ucygpOwotICAgICAgICAKLSAgICAgICAgKCBuZXcgUnVudGltZVZhbGlkYXRpb25UaHJlYWQoKSApLnN0YXJ0KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUnVudGltZU1hbmFnZXJJbXBsKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxJUnVudGltZUNvbXBvbmVudFR5cGU+IGdldFJ1bnRpbWVDb21wb25lbnRUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gcnVudGltZUNvbXBvbmVudFR5cGVzLmdldFVubW9kaWZpYWJsZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSdW50aW1lQ29tcG9uZW50VHlwZURlZmluZWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gcnVudGltZUNvbXBvbmVudFR5cGVzLmNvbnRhaW5zS2V5KCBpZCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lQ29tcG9uZW50VHlwZSBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSggZmluYWwgU3RyaW5nIGlkICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSByYyA9IHJ1bnRpbWVDb21wb25lbnRUeXBlcy5nZXQoIGlkICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcmMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLnJ1bnRpbWVDb21wb25lbnRUeXBlTm90RGVmaW5lZCwgaWQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggbXNnICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZUNvbXBvbmVudCBjcmVhdGVSdW50aW1lQ29tcG9uZW50KCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxTdHJpbmc+IHByb3BlcnRpZXMgKQotICAgIHsKLSAgICAgICAgZmluYWwgUnVudGltZUNvbXBvbmVudCByYyA9IG5ldyBSdW50aW1lQ29tcG9uZW50KCk7Ci0gICAgICAgIAotICAgICAgICByYy5zZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbiggcmN2ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcHJvcGVydGllcyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBNYXAuRW50cnk8U3RyaW5nLFN0cmluZz4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJjLnNldFByb3BlcnR5KCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElSdW50aW1lPiBnZXRSdW50aW1lcygpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHJ1bnRpbWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgYnJpZGdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8SVJ1bnRpbWU+KCBydW50aW1lcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PElSdW50aW1lPiBnZXRSdW50aW1lcyggZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBydW50aW1lcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyaWRnZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElSdW50aW1lPigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIElSdW50aW1lIHIgOiBydW50aW1lcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IGZhY2V0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggISByLnN1cHBvcnRzKCBmdiApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBzdXBwb3J0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCByICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1J1bnRpbWVEZWZpbmVkKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHJ1bnRpbWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgYnJpZGdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcnVudGltZXMuY29udGFpbnNLZXkoIG5hbWUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGdldFJ1bnRpbWUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggcnVudGltZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBicmlkZ2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVzLmdldCggbmFtZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcnVudGltZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5ydW50aW1lTm90RGVmaW5lZCwgbmFtZSApOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIG1zZyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcnVudGltZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGRlZmluZVJ1bnRpbWUoIGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUnVudGltZUNvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9wZXJ0aWVzICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggcnVudGltZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBSdW50aW1lIHIgPSBuZXcgUnVudGltZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByLnNldE5hbWUoIG5hbWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudCByYyA6IGNvbXBvbmVudHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHIuYWRkUnVudGltZUNvbXBvbmVudCggcmMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHByb3BlcnRpZXMgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBNYXAuRW50cnk8U3RyaW5nLFN0cmluZz4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgci5zZXRQcm9wZXJ0eSggZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJ1bnRpbWVzLmFkZCggci5nZXROYW1lKCksIHIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbm90aWZ5UnVudGltZUxpc3RlbmVycygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUnVudGltZSggZmluYWwgSVJ1bnRpbWUgcnVudGltZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIHJ1bnRpbWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHJ1bnRpbWVzLmRlbGV0ZSggcnVudGltZS5nZXROYW1lKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5UnVudGltZUxpc3RlbmVycygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSdW50aW1lTGlzdGVuZXIoIGZpbmFsIElMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIGxpc3RlbmVycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpc3RlbmVycy5hZGQoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVJ1bnRpbWVMaXN0ZW5lciggZmluYWwgSUxpc3RlbmVyIGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggbGlzdGVuZXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG5vdGlmeVJ1bnRpbWVMaXN0ZW5lcnMoKQotICAgIHsKLSAgICAgICAgZm9yKCBJTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQuVHlwZS4uLiB0eXBlcyApCi0gICAgewotICAgICAgICBydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeS5hZGRMaXN0ZW5lciggbGlzdGVuZXIsIHR5cGVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaXN0ZW5lciggZmluYWwgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciApCi0gICAgewotICAgICAgICBydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeS5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0U3VwcG9ydGVkRmFjZXRzKCBmaW5hbCBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBjb21wb3NpdGlvbiApCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudCByYyA6IGNvbXBvc2l0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBNYXBwaW5nIG0gOiBtYXBwaW5ncyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKCBtLmdldFN1cHBvcnRlZEZhY2V0cyggcmMgKSApOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldERlZmF1bHRGYWNldHMoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZXN1bHQgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggRGVmYXVsdEZhY2V0c0VudHJ5IGRmZSA6IGRlZmF1bHRGYWNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZGZlLm1hdGNoKCByY3YgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKCBkZmUuZmFjZXRzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJyaWRnZSgpCi0gICAgewotICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBmb3IoIE1hcC5FbnRyeTxTdHJpbmcsSVJ1bnRpbWVCcmlkZ2U+IGVudHJ5IDogYnJpZGdlcy5lbnRyeVNldCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJyaWQgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQnJpZGdlIGJyID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRmluZCB0aGUgcnVudGltZXMgYmVsb25naW5nIHRvIHRoaXMgYnJpZGdlIHRoYXQgYXJlIGN1cnJlbnRseQotICAgICAgICAgICAgLy8gaW4gdGhlIHN5c3RlbS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxCcmlkZ2VkUnVudGltZT4gZXhpc3RpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQnJpZGdlZFJ1bnRpbWU+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgciA6IHJ1bnRpbWVzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggciBpbnN0YW5jZW9mIEJyaWRnZWRSdW50aW1lICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEJyaWRnZWRSdW50aW1lIGJyaWRnZWQgPSAoQnJpZGdlZFJ1bnRpbWUpIHI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggYnJpZGdlZC5nZXRCcmlkZ2VJZCgpLmVxdWFscyggYnJpZCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucHV0KCBicmlkZ2VkLmdldE5hdGl2ZVJ1bnRpbWVJZCgpLCBicmlkZ2VkICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IHNldCBvZiBleHBvcnRlZCBydW50aW1lcy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gZXhwb3J0ZWQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cG9ydGVkID0gYnIuZ2V0RXhwb3J0ZWRSdW50aW1lTmFtZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIEJyaWRnZWRSdW50aW1lIHIgOiBleGlzdGluZy52YWx1ZXMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBydW50aW1lcy5yZW1vdmUoIHIuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYWJzb2xldGUgZW50cmllcy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBCcmlkZ2VkUnVudGltZSByIDogZXhpc3RpbmcudmFsdWVzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhIGV4cG9ydGVkLmNvbnRhaW5zKCByLmdldE5hdGl2ZVJ1bnRpbWVJZCgpICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcnVudGltZXMuZGVsZXRlKCByLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBlbnRyaWVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIFN0cmluZyBpZCA6IGV4cG9ydGVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggISBleGlzdGluZy5jb250YWluc0tleSggaWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVCcmlkZ2UuSVN0dWIgc3R1YiA9IGJyLmJyaWRnZSggaWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnJpZGdlZFJ1bnRpbWUgciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBCcmlkZ2VkUnVudGltZSggYnJpZCwgaWQsIHN0dWIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgci5zZXROYW1lKCBjcmVhdGVVbmlxdWVSdW50aW1lTmFtZSggaWQgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lcy5hZGQoIHIuZ2V0TmFtZSgpLCByICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG1vZGlmaWVkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBub3RpZnlSdW50aW1lTGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVuaXF1ZVJ1bnRpbWVOYW1lKCBmaW5hbCBTdHJpbmcgc3VnZ2VzdGlvbiApCi0gICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHN1Z2dlc3Rpb247Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMTsgcnVudGltZXMuY29udGFpbnMoIG5hbWUgKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFtZSA9IHN1Z2dlc3Rpb24gKyAiICgiICsgaSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRNZXRhZGF0YSgpCi0gICAgewotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUV4dGVuc2lvblBvaW50IHBvaW50IAotICAgICAgICAgICAgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCggRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRFTlNJT05fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBwb2ludCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJFeHRlbnNpb24gcG9pbnQgbm90IGZvdW5kISIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gY2ZnZWxzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElFeHRlbnNpb24gZXh0ZW5zaW9uIDogcG9pbnQuZ2V0RXh0ZW5zaW9ucygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZnZWwgOiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNmZ2Vscy5hZGQoIGNmZ2VsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfUlVOVElNRV9DT01QT05FTlRfVFlQRSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkUnVudGltZUNvbXBvbmVudFR5cGUoIGNvbmZpZyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogY2ZnZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9SVU5USU1FX0NPTVBPTkVOVF9WRVJTSU9OICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRSdW50aW1lQ29tcG9uZW50VmVyc2lvbiggY29uZmlnICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNhbGN1bGF0ZVZlcnNpb25Db21wYXJpc29uVGFibGVzKCk7Ci0KLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogY2ZnZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9BREFQVEVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRBZGFwdGVyKCBjb25maWcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfU1VQUE9SVEVEICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRNYXBwaW5nKCBjb25maWcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRSdW50aW1lQ29tcG9uZW50VHlwZSggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0KLSAgICAgICAgaWYoIGlkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgUnVudGltZUNvbXBvbmVudFR5cGUgcmN0ID0gbmV3IFJ1bnRpbWVDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgIHJjdC5zZXRJZCggaWQgKTsKLSAgICAgICAgcmN0LnNldFBsdWdpbklkKCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLQotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfVkVSU0lPTl9DT01QQVJBVE9SICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbG5hbWUgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggY2xuYW1lID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByY3Quc2V0VmVyc2lvbkNvbXBhcmF0b3IoIGNsbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBydW50aW1lQ29tcG9uZW50VHlwZXMuYWRkKCBpZCwgcmN0ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0eXBlID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9UWVBFICk7Ci0KLSAgICAgICAgaWYoIHR5cGUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9UWVBFICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyB2ZXIgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLQotICAgICAgICBpZiggdmVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfVkVSU0lPTiApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBSdW50aW1lQ29tcG9uZW50VHlwZSByY3QgCi0gICAgICAgICAgICA9IChSdW50aW1lQ29tcG9uZW50VHlwZSkgcnVudGltZUNvbXBvbmVudFR5cGVzLmdldCggdHlwZSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJjdCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5ydW50aW1lQ29tcG9uZW50VHlwZU5vdERlZmluZWQsIHR5cGUgKSArCi0gICAgICAgICAgICAgICAgICBOTFMuYmluZCggUmVzb3VyY2VzLnVzZWRJblBsdWdpbiwgY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIG1zZyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiA9IG5ldyBSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpOwotICAgICAgICAKLSAgICAgICAgcmN2LnNldFJ1bnRpbWVDb21wb25lbnRUeXBlKCByY3QgKTsKLSAgICAgICAgcmN2LnNldFZlcnNpb25TdHJpbmcoIHZlciApOwotICAgICAgICByY3Yuc2V0UGx1Z2luSWQoIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAKLSAgICAgICAgcmN0LmFkZFZlcnNpb24oIHJjdiApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmUtY29tcHV0ZXMgdGhlIHRhYmxlcyB0aGF0IGRlc2NyaWJlIGhvdyB2ZXJzaW9ucyBvZiBydW50aW1lIGNvbXBvbmVudHMKLSAgICAgKiBjb21wYXJlIHRvIGVhY2ggb3RoZXIuIFRoaXMgYWxsb3dzIHRoZSBJUnVudGltZUNvbXBvbmVudFZlcnNpb24uY29tcGFyZVRvKCkgCi0gICAgICogb3BlcmF0aW9uLCB3aGljaCBpcyBjYWxsZWQgcmF0aGVyIGZyZXF1ZW50bHksIHRvIGJlIHJlZHVjZWQgdG8gYSBoYXNoIAotICAgICAqIHRhYmxlIGxvb2t1cCBpbnN0ZWFkIG9mIGhhdmluZyB0byBkbyBhIHBhcnNlIGFuZCBjb21wYXJpc29uIG9mIHR3byAKLSAgICAgKiB2ZXJzaW9uIHN0cmluZ3MuCi0gICAgICovCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVWZXJzaW9uQ29tcGFyaXNvblRhYmxlcygpCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PElSdW50aW1lQ29tcG9uZW50VHlwZT4gYmFkUnVudGltZUNvbXBvbmVudFR5cGVzIAotICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ29tcG9uZW50VHlwZT4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdCA6IHJ1bnRpbWVDb21wb25lbnRUeXBlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wID0gcmN0LmdldFZlcnNpb25Db21wYXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24+IHZlcnNpb25zIAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiggcmN0LmdldFZlcnNpb25zKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLE1hcDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24sSW50ZWdlcj4+IGNvbXBUYWJsZXMKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24sTWFwPElSdW50aW1lQ29tcG9uZW50VmVyc2lvbixJbnRlZ2VyPj4oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiByY3YgOiB2ZXJzaW9ucyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21wVGFibGVzLnB1dCggcmN2LCBuZXcgSGFzaE1hcDxJUnVudGltZUNvbXBvbmVudFZlcnNpb24sSW50ZWdlcj4oKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IHZlcnNpb25zLnNpemUoKTsgaSA8IG47IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gaVZlciA9IHZlcnNpb25zLmdldCggaSApOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaVZlclN0ciA9IGlWZXIuZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLEludGVnZXI+IGlDb21wVGFibGUgPSBjb21wVGFibGVzLmdldCggaVZlciApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IGkgKyAxOyBqIDwgbjsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIGpWZXIgPSB2ZXJzaW9ucy5nZXQoIGogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBqVmVyU3RyID0galZlci5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLEludGVnZXI+IGpDb21wVGFibGUgPSBjb21wVGFibGVzLmdldCggalZlciApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gY29tcC5jb21wYXJlKCBpVmVyU3RyLCBqVmVyU3RyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wVGFibGUucHV0KCBqVmVyLCBuZXcgSW50ZWdlciggcmVzdWx0ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpDb21wVGFibGUucHV0KCBpVmVyLCBuZXcgSW50ZWdlciggcmVzdWx0ICogLTEgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggTWFwLkVudHJ5PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbixNYXA8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uLEludGVnZXI+PiBlbnRyeQotICAgICAgICAgICAgICAgICAgICAgOiBjb21wVGFibGVzLmVudHJ5U2V0KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ID0gKFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgcmN2LnNldENvbXBhcmlzb25UYWJsZSggZW50cnkuZ2V0VmFsdWUoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGZhaWx1cmUgaGVyZSBpcyBkdWUgdG8gdGhlIHByb2JsZW0gbG9hZGluZyB0aGUgcHJvdmlkZWQKLSAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIGNvbXBhcmF0b3Igb3IgZHVlIHRvIHRoZSBwcm9ibGVtIGNvbXBhcmluZyB0aGUKLSAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIHN0cmluZy4gSW4gZWl0aGVyIGNhc2UsIHdlIGxvZyB0aGUgZXhjZXB0aW9uIGFuZAotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoaXMgcnVudGltZSBjb21wb25lbnQgdHlwZSBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gdG8ga2VlcCBhIGZhdWx0eSBydW50aW1lIGNvbXBvbmVudCB0eXBlIGZyb20gZHJhZ2dpbmcKLSAgICAgICAgICAgICAgICAvLyBkb3duIHRoZSBlbnRpcmUgc3lzdGVtLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICBiYWRSdW50aW1lQ29tcG9uZW50VHlwZXMuYWRkKCByY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudFR5cGUgcmN0IDogYmFkUnVudGltZUNvbXBvbmVudFR5cGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgcnVudGltZUNvbXBvbmVudFR5cGVzLnJlbW92ZSggcmN0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkQWRhcHRlciggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBJUnVudGltZUNvbXBvbmVudFR5cGUgcmN0eXBlID0gbnVsbDsKLSAgICAgICAgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfUlVOVElNRV9DT01QT05FTlQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0KLSAgICAgICAgICAgICAgICBpZiggaWQgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9JRCApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKCBpZCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5ydW50aW1lQ29tcG9uZW50VHlwZU5vdERlZmluZWQsIGlkICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCggUmVzb3VyY2VzLnVzZWRJblBsdWdpbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJjdHlwZSA9IGdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCBpZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdmVyc2lvbiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhIHJjdHlwZS5oYXNWZXJzaW9uKCB2ZXJzaW9uICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLnJ1bnRpbWVDb21wb25lbnRWZXJzaW9uTm90RGVmaW5lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgdmVyc2lvbiApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmN2ZXJzaW9uID0gcmN0eXBlLmdldFZlcnNpb24oIHZlcnNpb24gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9GQUNUT1JZICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoIEFUVFJfQ0xBU1MgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmYWN0b3J5ID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY2hpbGQsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEFUVFJfVFlQRSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9DTEFTUyApOwotCi0gICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjaGlsZCwgQVRUUl9DTEFTUyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVzLmFkZCggdHlwZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgU2V0PElSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4gdmVyc2lvbnM7Ci0gICAgICAgIAotICAgICAgICBpZiggcmN2ZXJzaW9uID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJzaW9ucyA9IHJjdHlwZS5nZXRWZXJzaW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmVyc2lvbnMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIHJjdmVyc2lvbiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2IDogdmVyc2lvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBSdW50aW1lQ29tcG9uZW50VmVyc2lvbiB2ID0gKFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKSByY3Y7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggU3RyaW5nIHR5cGUgOiB0eXBlcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdi5hZGRBZGFwdGVyRmFjdG9yeSggdHlwZSwgcGx1Z2luLCBmYWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkTWFwcGluZyggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBNYXBwaW5nIG0gPSBuZXcgTWFwcGluZygpOwotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRkFDRVQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gcmVhZFByb2plY3RGYWNldFJlZiggY2hpbGQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdiA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgVmVyc2lvbkV4cHI8UHJvamVjdEZhY2V0VmVyc2lvbj4gZXhwciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHYgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IG5ldyBWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPiggZiwgdiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbS5mYWNldHMucHV0KCBmLCBleHByICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaGlsZE5hbWUuZXF1YWxzKCBFTF9SVU5USU1FX0NPTVBPTkVOVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggY2hpbGQuZ2V0QXR0cmlidXRlKCBBTlkgKSA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3QgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IHJlYWRSdW50aW1lQ29tcG9uZW50VHlwZVJlZiggY2hpbGQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCByY3QgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdiA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgICAgIFZlcnNpb25FeHByPFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiBleHByID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCB2ICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IG5ldyBWZXJzaW9uRXhwcjxSdW50aW1lQ29tcG9uZW50VmVyc2lvbj4oIHJjdCwgdiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbS5ydW50aW1lQ29tcG9uZW50cy5wdXQoIHJjdCwgZXhwciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbWFwcGluZ3MuYWRkKCBtICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZEJyaWRnZXNFeHRlbnNpb25zKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgCi0gICAgICAgICAgICA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSSURHRVNfRVhURU5TSU9OX0lEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcG9pbnQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiRXh0ZW5zaW9uIHBvaW50IG5vdCBmb3VuZCEiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNmZ2VscyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBvaW50LmdldEV4dGVuc2lvbnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNmZ2VsIDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjZmdlbHMuYWRkKCBjZmdlbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnIDogY2ZnZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKCBFTF9CUklER0UgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gY29uZmlnLmdldEF0dHJpYnV0ZSggQVRUUl9JRCApOwotCi0gICAgICAgICAgICAgICAgaWYoIGlkID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0lEICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsbmFtZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfQ0xBU1MgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBjbG5hbWUgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBjb25maWcsIEFUVFJfQ0xBU1MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVCcmlkZ2UgYnI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiciA9IGluc3RhbnRpYXRlKCBwbHVnaW5JZCwgY2xuYW1lLCBJUnVudGltZUJyaWRnZS5jbGFzcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyaWRnZXMucHV0KCBpZCwgYnIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZERlZmF1bHRGYWNldHNFeHRlbnNpb25zKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgCi0gICAgICAgICAgICA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRkFDRVRTX0VYVEVOU0lPTl9JRCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHBvaW50ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIkV4dGVuc2lvbiBwb2ludCBub3QgZm91bmQhIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjZmdlbHMgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSUV4dGVuc2lvbiBleHRlbnNpb24gOiBwb2ludC5nZXRFeHRlbnNpb25zKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBjZmdlbCA6IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2ZnZWxzLmFkZCggY2ZnZWwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA6IGNmZ2VscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyggRUxfREVGQVVMVF9GQUNFVFMgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZERlZmF1bHRGYWNldHMoIGNvbmZpZyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZERlZmF1bHRGYWNldHMoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgKQotICAgIHsKLSAgICAgICAgZmluYWwgRGVmYXVsdEZhY2V0c0VudHJ5IGRmZSA9IG5ldyBEZWZhdWx0RmFjZXRzRW50cnkoKTsKLSAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlblsgaSBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNoaWxkTmFtZS5lcXVhbHMoIEVMX1JVTlRJTUVfQ09NUE9ORU5UICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRmZS5yY3QgPSByZWFkUnVudGltZUNvbXBvbmVudFR5cGVSZWYoIGNoaWxkICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGRmZS5yY3QgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ID0gY2hpbGQuZ2V0QXR0cmlidXRlKCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggdiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luSWQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGRmZS5yY3ZleHByID0gbmV3IFZlcnNpb25FeHByPFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiggZGZlLnJjdCwgdiwgcGx1Z2luSWQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggZS5nZXRTdGF0dXMoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggY2hpbGROYW1lLmVxdWFscyggRUxfRkFDRVQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gcmVhZFByb2plY3RGYWNldFJlZiggY2hpbGQgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZiA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlciA9IGNoaWxkLmdldEF0dHJpYnV0ZSggQVRUUl9WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHZlciA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNoaWxkLCBBVFRSX1ZFUlNJT04gKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISBmLmhhc1ZlcnNpb24oIHZlciApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC5SZXNvdXJjZXMuZmFjZXRWZXJzaW9uTm90RGVmaW5lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2V0SWQoKSwgdmVyICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBtc2cgKz0gTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRmZS5mYWNldHMuYWRkKCBmLmdldFZlcnNpb24oIHZlciApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBkZmUucmN0ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRlZmF1bHRGYWNldHMuYWRkKCBkZmUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJlYWRSdW50aW1lQ29tcG9uZW50VHlwZVJlZiggZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBjb25maWcuZ2V0QXR0cmlidXRlKCBBVFRSX0lEICk7Ci0gICAgICAgIAotICAgICAgICBpZiggaWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9JRCApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIGlzUnVudGltZUNvbXBvbmVudFR5cGVEZWZpbmVkKCBpZCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5ydW50aW1lQ29tcG9uZW50VHlwZU5vdERlZmluZWQsIGlkICkgKwotICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIFJlc291cmNlcy51c2VkSW5QbHVnaW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBnZXRSdW50aW1lQ29tcG9uZW50VHlwZSggaWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCByZWFkUHJvamVjdEZhY2V0UmVmKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIEFUVFJfSUQgKTsKLQotICAgICAgICBpZiggaWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGNvbmZpZywgQVRUUl9JRCApOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCAhIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCggaWQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSW1wbC5yZXBvcnRNaXNzaW5nRmFjZXQoIGlkLCBjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBpZCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcGFyYW1zIAotICAgICAgICAgICAgPSBuZXcgU3RyaW5nW10geyBlbC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwgZWwuZ2V0TmFtZSgpLCBhdHRyaWJ1dGUgfTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZCggUmVzb3VyY2VzLm1pc3NpbmdBdHRyaWJ1dGUsIHBhcmFtcyApOyAKLSAgICAKLSAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZyggbXNnICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1hcHBpbmcKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNYXA8SVByb2plY3RGYWNldCxWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPj4gZmFjZXRzIAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJUHJvamVjdEZhY2V0LFZlcnNpb25FeHByPFByb2plY3RGYWNldFZlcnNpb24+PigpOwotICAgICAgICAKLSAgICAgICAgcHVibGljIGZpbmFsIE1hcDxJUnVudGltZUNvbXBvbmVudFR5cGUsVmVyc2lvbkV4cHI8UnVudGltZUNvbXBvbmVudFZlcnNpb24+PiBydW50aW1lQ29tcG9uZW50cyAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8SVJ1bnRpbWVDb21wb25lbnRUeXBlLFZlcnNpb25FeHByPFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPj4oKTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRTdXBwb3J0ZWRGYWNldHMoIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjICkKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lQ29tcG9uZW50VHlwZSByY3QgPSByYy5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHJjdiA9IHJjLmdldFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnJ1bnRpbWVDb21wb25lbnRzLmNvbnRhaW5zS2V5KCByY3QgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmVyc2lvbkV4cHI8UnVudGltZUNvbXBvbmVudFZlcnNpb24+IGV4cHIgPSB0aGlzLnJ1bnRpbWVDb21wb25lbnRzLmdldCggcmN0ICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGV4cHIgIT0gbnVsbCAmJiAhIGV4cHIuY2hlY2soIHJjdiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoICEgdGhpcy5ydW50aW1lQ29tcG9uZW50cy5pc0VtcHR5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIE1hcC5FbnRyeTxJUHJvamVjdEZhY2V0LFZlcnNpb25FeHByPFByb2plY3RGYWNldFZlcnNpb24+PiBlbnRyeSAKLSAgICAgICAgICAgICAgICAgOiB0aGlzLmZhY2V0cy5lbnRyeVNldCgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0IGYgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBWZXJzaW9uRXhwcjxQcm9qZWN0RmFjZXRWZXJzaW9uPiBleHByID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZi5nZXRWZXJzaW9ucygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBleHByID09IG51bGwgfHwgZXhwci5jaGVjayggZnYgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIGZ2ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGVmYXVsdEZhY2V0c0VudHJ5Ci0gICAgewotICAgICAgICBwdWJsaWMgSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJjdDsKLSAgICAgICAgcHVibGljIFZlcnNpb25FeHByPFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiByY3ZleHByOwotICAgICAgICBwdWJsaWMgZmluYWwgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmYWNldHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKCBmaW5hbCBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2ICkKLSAgICAgICAgCi0gICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCByY3YuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKSAhPSB0aGlzLnJjdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJjdmV4cHIuY2hlY2soIHJjdiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVWYWxpZGF0aW9uVGhyZWFkCi0KLSAgICAgICAgZXh0ZW5kcyBUaHJlYWQKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNBYm9ydGVkOwotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsSVN0YXR1cz4gdmFsaWRhdGlvblJlc3VsdHM7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgUnVudGltZVZhbGlkYXRpb25UaHJlYWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlzQWJvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uUmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJU3RhdHVzPigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIElTdGF0dXMgZ2V0VmFsaWRhdGlvblJlc3VsdCggZmluYWwgSVJ1bnRpbWUgcnVudGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy52YWxpZGF0aW9uUmVzdWx0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvblJlc3VsdHMuZ2V0KCBydW50aW1lLmdldE5hbWUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgc2V0VmFsaWRhdGlvblJlc3VsdCggZmluYWwgSVJ1bnRpbWUgcnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXMgdmFsaWRhdGlvblJlc3VsdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCggdGhpcy52YWxpZGF0aW9uUmVzdWx0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uUmVzdWx0cy5wdXQoIHJ1bnRpbWUuZ2V0TmFtZSgpLCB2YWxpZGF0aW9uUmVzdWx0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggISB0aGlzLmlzQWJvcnRlZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKCBJUnVudGltZSBydW50aW1lIDogUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZXMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIG9sZFJlc3VsdCA9IGdldFZhbGlkYXRpb25SZXN1bHQoIHJ1bnRpbWUgKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBuZXdSZXN1bHQgPSBydW50aW1lLnZhbGlkYXRlKCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggb2xkUmVzdWx0ID09IG51bGwgfHwgISBvbGRSZXN1bHQuZ2V0TWVzc2FnZSgpLmVxdWFscyggbmV3UmVzdWx0LmdldE1lc3NhZ2UoKSApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsaWRhdGlvblJlc3VsdCggcnVudGltZSwgbmV3UmVzdWx0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lTGlmZWN5Y2xlRXZlbnQgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBWYWxpZGF0aW9uU3RhdHVzQ2hhbmdlZEV2ZW50KCBydW50aW1lLCBvbGRSZXN1bHQsIG5ld1Jlc3VsdCApOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJSZWdpc3RyeS5ub3RpZnlMaXN0ZW5lcnMoIGV2ZW50ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCggMTAwMCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaXNBYm9ydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0F0dHJpYnV0ZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZUNvbXBvbmVudFR5cGVOb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lQ29tcG9uZW50VmVyc2lvbk5vdERlZmluZWQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVOb3REZWZpbmVkOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VkSW5QbHVnaW47Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBSdW50aW1lTWFuYWdlckltcGwuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lTWFuYWdlckltcGwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvUnVudGltZU1hbmFnZXJJbXBsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzczZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9SdW50aW1lTWFuYWdlckltcGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotbWlzc2luZ0F0dHJpYnV0ZSA9IEFuIGV4dGVuc2lvbiBlbGVtZW50IDx7MX0+IGluIHBsdWdpbiB7MH0gaXMgbWlzc2luZyBhIHJlcXVpcmVkIGF0dHJpYnV0ZSB7Mn0uCi1ydW50aW1lQ29tcG9uZW50VHlwZU5vdERlZmluZWQgPSBSdW50aW1lIGNvbXBvbmVudCB0eXBlIHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLXJ1bnRpbWVDb21wb25lbnRWZXJzaW9uTm90RGVmaW5lZCA9IFZlcnNpb24gezF9IG9mIHJ1bnRpbWUgY29tcG9uZW50IHR5cGUgezB9IGhhcyBub3QgYmVlbiBkZWZpbmVkLgotcnVudGltZU5vdERlZmluZWQgPSBSdW50aW1lIHswfSBoYXMgbm90IGJlZW4gZGVmaW5lZC4KLXVzZWRJblBsdWdpbiA9IFwgSXQgaXMgdXNlZCBpbiBwbHVnaW4gezB9LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9Vbmtub3duUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9pbnRlcm5hbC9Vbmtub3duUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDI1ZTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3J1bnRpbWUvaW50ZXJuYWwvVW5rbm93blJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLQotLyoqCi0gKiBVc2VkIHRvIHJlcHJlc2VudCBhIHJ1bnRpbWUgdGhhdCdzIHJlZmVyZW5jZWQgYnkgYSBwcm9qZWN0LCBidXQgaXMgbm90Ci0gKiBkZWZpbmVkIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbmtub3duUnVudGltZQotCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWUKLSAgICAKLXsKLSAgICBwdWJsaWMgVW5rbm93blJ1bnRpbWUoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHNldE5hbWUoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PElSdW50aW1lQ29tcG9uZW50PiBnZXRSdW50aW1lQ29tcG9uZW50cygpCi0gICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvQWJzdHJhY3RGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvQWJzdHJhY3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5NzYyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0Fic3RyYWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLklGaWx0ZXIuSUZpbHRlckV2ZW50LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5BYnN0cmFjdExpc3RlbmVyUmVnaXN0cnk7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RmlsdGVyPFQ+Ci0KLSAgICBpbXBsZW1lbnRzIElGaWx0ZXI8VD4KLQotewotICAgIHByaXZhdGUgRmlsdGVyTGlzdGVuZXJSZWdpc3RyeTxUPiBsaXN0ZW5lcnMgPSBuZXcgRmlsdGVyTGlzdGVuZXJSZWdpc3RyeTxUPigpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCBmaW5hbCBJRmlsdGVyTGlzdGVuZXI8VD4gbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGaWx0ZXJFdmVudC5UeXBlLi4uIHR5cGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzLmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgdHlwZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElGaWx0ZXJMaXN0ZW5lcjxUPiBsaXN0ZW5lciApCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVycy5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCBmaW5hbCBJRmlsdGVyRXZlbnQ8VD4gZXZlbnQgKQotICAgIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lcnMubm90aWZ5TGlzdGVuZXJzKCBldmVudC5nZXRUeXBlKCksIGV2ZW50ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEZpbHRlckxpc3RlbmVyUmVnaXN0cnk8VD4KLSAgICAKLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdExpc3RlbmVyUmVnaXN0cnk8VHlwZSxJRmlsdGVyRXZlbnQ8VD4sSUZpbHRlckxpc3RlbmVyPFQ+PgotICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIEZpbHRlckxpc3RlbmVyUmVnaXN0cnkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlciggVHlwZS5jbGFzcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVyKCBmaW5hbCBJRmlsdGVyTGlzdGVuZXI8VD4gbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmlsdGVyRXZlbnQ8VD4gZXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudCggZXZlbnQgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvRXZlbnRMaXN0ZW5lclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0V2ZW50TGlzdGVuZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjNlZGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvRXZlbnRMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRXZlbnRMaXN0ZW5lclJlZ2lzdHJ5PFQgZXh0ZW5kcyBFbnVtPFQ+LEU+Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiBldmVudFR5cGVDbGFzczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxULFNldDxJRXZlbnRMaXN0ZW5lcjxFPj4+IGxpc3RlbmVyczsKLSAgICAKLSAgICBwdWJsaWMgRXZlbnRMaXN0ZW5lclJlZ2lzdHJ5KCBmaW5hbCBDbGFzczxUPiBldmVudFR5cGVDbGFzcyApCi0gICAgewotICAgICAgICB0aGlzLmV2ZW50VHlwZUNsYXNzID0gZXZlbnRUeXBlQ2xhc3M7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEVudW1NYXA8VCxTZXQ8SUV2ZW50TGlzdGVuZXI8RT4+PiggdGhpcy5ldmVudFR5cGVDbGFzcyApOwotICAgICAgICAKLSAgICAgICAgZm9yKCBUIHQgOiB0aGlzLmV2ZW50VHlwZUNsYXNzLmdldEVudW1Db25zdGFudHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1dCggdCwgbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8SUV2ZW50TGlzdGVuZXI8RT4+KCkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciggZmluYWwgSUV2ZW50TGlzdGVuZXI8RT4gbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFQuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgfHwgdHlwZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBUIHR5cGUgOiAoIHR5cGVzLmxlbmd0aCA+IDAgPyB0eXBlcyA6IHRoaXMuZXZlbnRUeXBlQ2xhc3MuZ2V0RW51bUNvbnN0YW50cygpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoIHR5cGUgKS5hZGQoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIElFdmVudExpc3RlbmVyPEU+IGxpc3RlbmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCBsaXN0ZW5lciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIFNldDxJRXZlbnRMaXN0ZW5lcjxFPj4gbGlzdGVuZXJzIDogdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKCBsaXN0ZW5lciApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyggZmluYWwgVCBldmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFIGV2ZW50ICkKLSAgICB7Ci0gICAgICAgIGZvciggSUV2ZW50TGlzdGVuZXI8RT4gbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycy5nZXQoIGV2ZW50VHlwZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXZlbnQoIGV2ZW50ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZhY2V0Q29yZVBsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvRmlsdGVyRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvRmlsdGVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmYTRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0ZpbHRlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWw7Ci0KLS8qKgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEZpbHRlckV2ZW50PFQ+Ci0KLSAgICBpbXBsZW1lbnRzIElGaWx0ZXIuSUZpbHRlckV2ZW50PFQ+Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBJRmlsdGVyPFQ+IGZpbHRlcjsKLSAgICBwcml2YXRlIGZpbmFsIFR5cGUgZXZlbnRUeXBlOwotICAgIAotICAgIHB1YmxpYyBGaWx0ZXJFdmVudCggZmluYWwgSUZpbHRlcjxUPiBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGV2ZW50VHlwZSApCi0gICAgewotICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKLSAgICAgICAgdGhpcy5ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRmlsdGVyPFQ+IGdldEZpbHRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5ldmVudFR5cGU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9JRXZlbnRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9JRXZlbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBmODRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvSUV2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbDsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElFdmVudExpc3RlbmVyPEU+Ci17Ci0gICAgdm9pZCBoYW5kbGVFdmVudCggRSBldmVudCApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9JRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwZTc2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL0lGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyBmaWx0ZXJzIGZvciB2YXJpb3VzIG9iamVjdCB0eXBlcy4KLSAqIAotICogQHNpbmNlIDMuMAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRmlsdGVyPFQ+Ci17Ci0gICAgaW50ZXJmYWNlIElGaWx0ZXJFdmVudDxUPgotICAgIHsKLSAgICAgICAgZW51bSBUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZJTFRFUl9DSEFOR0VECi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFR5cGUgZ2V0VHlwZSgpOwotICAgICAgICBJRmlsdGVyPFQ+IGdldEZpbHRlcigpOwotICAgIH0KLSAgICAKLSAgICBpbnRlcmZhY2UgSUZpbHRlckxpc3RlbmVyPFQ+Ci0gICAgewotICAgICAgICB2b2lkIGhhbmRsZUV2ZW50KCBJRmlsdGVyRXZlbnQ8VD4gZXZlbnQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB0byBsZXQgdGhlIGZpbHRlciBtYWtlIHRoZSBkZXRlcm1pbmF0aW9uIHdoZXRoZXIgYW4gb2JqZWN0Ci0gICAgICogcGFzc2VzIHRocm91Z2ggdGhlIGZpbHRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdGhhdCB0aGUgZmlsdGVyIHNob3VsZCBjaGVjawotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBwYXNzZXMgdGhyb3VnaCB0aGUgZmlsdGVyIGFuZCAKLSAgICAgKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICAKLSAgICBib29sZWFuIGNoZWNrKCBUIG9iamVjdCApOwotICAgIAotICAgIHZvaWQgYWRkTGlzdGVuZXIoIElGaWx0ZXJMaXN0ZW5lcjxUPiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICBJRmlsdGVyRXZlbnQuVHlwZS4uLiB0eXBlcyApOwotICAgIAotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIElGaWx0ZXJMaXN0ZW5lcjxUPiBsaXN0ZW5lciApOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9BYnN0cmFjdExpc3RlbmVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvQWJzdHJhY3RMaXN0ZW5lclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDc3MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9BYnN0cmFjdExpc3RlbmVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5U2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3RlbmVyUmVnaXN0cnk8VCBleHRlbmRzIEVudW08VD4sRSxMPgotewotICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8VD4gZXZlbnRUeXBlQ2xhc3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8VCxTZXQ8TD4+IGxpc3RlbmVyczsKLSAgICAKLSAgICBwdWJsaWMgQWJzdHJhY3RMaXN0ZW5lclJlZ2lzdHJ5KCBmaW5hbCBDbGFzczxUPiBldmVudFR5cGVDbGFzcyApCi0gICAgewotICAgICAgICB0aGlzLmV2ZW50VHlwZUNsYXNzID0gZXZlbnRUeXBlQ2xhc3M7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEVudW1NYXA8VCxTZXQ8TD4+KCB0aGlzLmV2ZW50VHlwZUNsYXNzICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIFQgdCA6IHRoaXMuZXZlbnRUeXBlQ2xhc3MuZ2V0RW51bUNvbnN0YW50cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHV0KCB0LCBuZXcgQ29weU9uV3JpdGVBcnJheVNldDxMPigpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoIGZpbmFsIEwgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFQuLi4gdHlwZXMgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgfHwgdHlwZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBUIHR5cGUgOiAoIHR5cGVzLmxlbmd0aCA+IDAgPyB0eXBlcyA6IHRoaXMuZXZlbnRUeXBlQ2xhc3MuZ2V0RW51bUNvbnN0YW50cygpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoIHR5cGUgKS5hZGQoIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIGZpbmFsIEwgbGlzdGVuZXIgKQotICAgIHsKLSAgICAgICAgaWYoIGxpc3RlbmVyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciggU2V0PEw+IGxpc3RlbmVycyA6IHRoaXMubGlzdGVuZXJzLnZhbHVlcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoIGZpbmFsIFQgZXZlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRSBldmVudCApCi0gICAgewotICAgICAgICBmb3IoIEwgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycy5nZXQoIGV2ZW50VHlwZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoIGxpc3RlbmVyLCBldmVudCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbm90aWZ5TGlzdGVuZXIoIGZpbmFsIEwgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEUgZXZlbnQgKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvRmlsZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzOWJiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsZVV0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0RPVF9QUk9KRUNUID0gIi5wcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgRmlsZVV0aWwoKSB7fQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUVkaXQoIGZpbmFsIElGaWxlLi4uIGZpbGVzICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBJU3RhdHVzIHN0ID0gd3MudmFsaWRhdGVFZGl0KCBmaWxlcywgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggc3QgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSByZXNvdXJjZSBmcm9tIGEgcGx1Z2luIHRvIGEgZGVzdGluYXRpb24gaW4gdGhlIHdvcmtzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwbHVnaW5JZCB0aGUgcGx1Z2luIGlkCi0gICAgICogQHBhcmFtIHBhdGhJblBsdWdpbiB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBwbHVnaW4KLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZyb21QbHVnaW4oIGZpbmFsIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHBhdGhJblBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElGaWxlIGRlc3RpbmF0aW9uICkKLQotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBjb3B5RnJvbVBsdWdpbiggcGx1Z2luSWQsIHBhdGhJblBsdWdpbiwgZGVzdGluYXRpb24uZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSByZXNvdXJjZSBmcm9tIGEgcGx1Z2luIHRvIGEgZGVzdGluYXRpb24gaW4gdGhlIHdvcmtzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgdGhlIHBsdWdpbiBidW5kbGUKLSAgICAgKiBAcGFyYW0gcGF0aEluUGx1Z2luIHRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIHBsdWdpbgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGcm9tUGx1Z2luKCBmaW5hbCBCdW5kbGUgYnVuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggcGF0aEluUGx1Z2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZpbGUgZGVzdGluYXRpb24gKQotCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0KLSAgICB7Ci0gICAgICAgIGNvcHlGcm9tUGx1Z2luKCBidW5kbGUsIHBhdGhJblBsdWdpbiwgZGVzdGluYXRpb24uZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSByZXNvdXJjZSBmcm9tIGEgcGx1Z2luIHRvIGEgZGVzdGluYXRpb24gb24gdGhlIGZpbGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHRoZSBwbHVnaW4gaWQKLSAgICAgKiBAcGFyYW0gcGF0aEluUGx1Z2luIHRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIHBsdWdpbgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZQotICAgICAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RnJvbVBsdWdpbiggZmluYWwgU3RyaW5nIHBsdWdpbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggcGF0aEluUGx1Z2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBkZXN0aW5hdGlvbiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSggcGx1Z2luSWQgKTsKLSAgICAgICAgY29weUZyb21QbHVnaW4oIGJ1bmRsZSwgcGF0aEluUGx1Z2luLCBkZXN0aW5hdGlvbiApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSByZXNvdXJjZSBmcm9tIGEgcGx1Z2luIHRvIGEgZGVzdGluYXRpb24gb24gdGhlIGZpbGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSB0aGUgcGx1Z2luIGJ1bmRsZQotICAgICAqIEBwYXJhbSBwYXRoSW5QbHVnaW4gdGhlIHBhdGggb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgcGx1Z2luCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZyb21QbHVnaW4oIGZpbmFsIEJ1bmRsZSBidW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoSW5QbHVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRlc3RpbmF0aW9uICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBjb250ZW50cyA9IHJlYWRGaWxlRnJvbVBsdWdpbiggYnVuZGxlLCBwYXRoSW5QbHVnaW4gKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZUZpbGUoIGRlc3RpbmF0aW9uLCBjb250ZW50cyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGVudHMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApIHt9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSByZWFkRmlsZUZyb21QbHVnaW4oIGZpbmFsIEJ1bmRsZSBidW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHBhdGhJblBsdWdpbiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKCBidW5kbGUsIHBhdGhJblBsdWdpbiwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIGUuZ2V0TWVzc2FnZSgpLCBlICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldFdvcmtzcGFjZUZpbGUoIGZpbmFsIEZpbGUgZiApCi0gICAgewotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBJV29ya3NwYWNlUm9vdCB3c3Jvb3QgPSB3cy5nZXRSb290KCk7Ci0gICAgICAgIGZpbmFsIElQYXRoIHBhdGggPSBuZXcgUGF0aCggZi5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZpbGVbXSB3c0ZpbGVzID0gd3Nyb290LmZpbmRGaWxlc0ZvckxvY2F0aW9uKCBwYXRoICk7Ci0gICAgICAgIAotICAgICAgICBpZiggd3NGaWxlcy5sZW5ndGggPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdzRmlsZXNbIDAgXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRXb3Jrc3BhY2VDb250YWluZXIoIGZpbmFsIEZpbGUgZiApCi0gICAgewotICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBmaW5hbCBJV29ya3NwYWNlUm9vdCB3c3Jvb3QgPSB3cy5nZXRSb290KCk7Ci0gICAgICAgIGZpbmFsIElQYXRoIHBhdGggPSBuZXcgUGF0aCggZi5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNvbnRhaW5lcltdIHdzQ29udGFpbmVycyA9IHdzcm9vdC5maW5kQ29udGFpbmVyc0ZvckxvY2F0aW9uKCBwYXRoICk7Ci0gICAgICAgIAotICAgICAgICBpZiggd3NDb250YWluZXJzLmxlbmd0aCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3NDb250YWluZXJzWyAwIF07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKCBmaW5hbCBGaWxlIGYgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGlmKCBmLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGYuaXNGaWxlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmxvY2F0aW9uSXNGaWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBta2RpcnMoIGYuZ2V0UGFyZW50RmlsZSgpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElDb250YWluZXIgd3NDb250YWluZXIgPSBnZXRXb3Jrc3BhY2VDb250YWluZXIoIGYgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHdzQ29udGFpbmVyICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSBhIGZvbGRlci4uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElGb2xkZXIgaUZvbGRlciA9IChJRm9sZGVyKSB3c0NvbnRhaW5lcjsKLSAgICAgICAgICAgICAgICBpRm9sZGVyLmNyZWF0ZSggdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTdWNjZXNzZnVsID0gZi5ta2RpcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhIGlzU3VjY2Vzc2Z1bCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgICA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZmFpbGVkVG9DcmVhdGVEaXJlY3RvcnksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZSggZmluYWwgRmlsZSBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGNvbnRlbnRzICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBpZiggZi5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBmLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cKLSAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmxvY2F0aW9uSXNEaXJlY3RvcnksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1rZGlycyggZi5nZXRQYXJlbnRGaWxlKCkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSUZpbGUgd3NmaWxlID0gZ2V0V29ya3NwYWNlRmlsZSggZiApOwotCi0gICAgICAgIGlmKCB3c2ZpbGUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRlRWRpdCggbmV3IElGaWxlW10geyB3c2ZpbGUgfSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggd3NmaWxlLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3c2ZpbGUuc2V0Q29udGVudHMoIGNvbnRlbnRzLCB0cnVlLCBmYWxzZSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzZmlsZS5jcmVhdGUoIGNvbnRlbnRzLCB0cnVlLCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggZi5leGlzdHMoKSAmJiAhIGYuY2FuV3JpdGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgICAgID0gTkxTLmJpbmQoIFJlc291cmNlcy5jYW5ub3RXcml0ZUZpbGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIEZhY2V0Q29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggbXNnICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWyAxMDI0IF07Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgY291bnQ7ICggY291bnQgPSBjb250ZW50cy5yZWFkKCBidWZmZXIgKSApICE9IC0xOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIGJ1ZmZlciwgMCwgY291bnQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyAKLSAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhaWxlZFdoaWxlV3JpdGluZywgZi5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZywgZSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIG91dCAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApIHt9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkV2hpbGVXcml0aW5nOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RXcml0ZUZpbGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZFRvQ3JlYXRlRGlyZWN0b3J5OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbklzRGlyZWN0b3J5OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbklzRmlsZTsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIEZpbGVVdGlsLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9GaWxlVXRpbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9GaWxlVXRpbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU1MTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvRmlsZVV0aWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotZmFpbGVkV2hpbGVXcml0aW5nID0gRmFpbGVkIHdoaWxlIHdyaXRpbmcgZmlsZSAiezB9Ii4KLWNhbm5vdFdyaXRlRmlsZSA9IEZpbGUgInswfSIgaXMgbm90IHdyaXRhYmxlLiAKLWZhaWxlZFRvQ3JlYXRlRGlyZWN0b3J5ID0gRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgInswfSIuCi1sb2NhdGlvbklzRGlyZWN0b3J5ID0gTG9jYXRpb24gInswfSIgaXMgYSBkaXJlY3RvcnkuCi1sb2NhdGlvbklzRmlsZSA9IExvY2F0aW9uICJ7MH0iIGlzIGEgZmlsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL0luZGV4ZWRTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvSW5kZXhlZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmY2OGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvSW5kZXhlZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5kZXhlZFNldDxLLFY+Ci0KLSAgICBleHRlbmRzIEhhc2hTZXQ8Vj4KLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxWPiB1bm1vZGlmaWFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SyxWPiBpbmRleDsKLSAgICAKLSAgICBwdWJsaWMgSW5kZXhlZFNldCgpCi0gICAgewotICAgICAgICB0aGlzLnVubW9kaWZpYWJsZSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggdGhpcyApOwotICAgICAgICB0aGlzLmluZGV4ID0gbmV3IEhhc2hNYXA8SyxWPigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGQoIGZpbmFsIEsga2V5LAotICAgICAgICAgICAgICAgICAgICAgZmluYWwgViB2YWx1ZSApCi0gICAgewotICAgICAgICByZW1vdmUoIHRoaXMuaW5kZXguZ2V0KCBrZXkgKSApOwotICAgICAgICBhZGQoIHZhbHVlICk7Ci0gICAgICAgIHRoaXMuaW5kZXgucHV0KCBrZXksIHZhbHVlICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZSggZmluYWwgSyBrZXkgKQotICAgIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gdGhpcy5pbmRleC5nZXQoIGtleSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHZhbHVlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmUoIHZhbHVlICk7Ci0gICAgICAgICAgICB0aGlzLmluZGV4LnJlbW92ZSgga2V5ICk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgViBnZXQoIGZpbmFsIEsga2V5ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmluZGV4LmdldCgga2V5ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KCBmaW5hbCBLIGtleSApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5jb250YWluc0tleSgga2V5ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8Vj4gZ2V0VW5tb2RpZmlhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnVubW9kaWZpYWJsZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9NaXNjVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9NaXNjVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNiYTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvTWlzY1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbDsKLQotLyoqCi0gKiBDb250YWlucyBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgZnVuY3Rpb25zLgotICogCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWlzY1V0aWwKLXsKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWwoIGZpbmFsIE9iamVjdCBvYmoxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iajIgKQotICAgIHsKLSAgICAgICAgaWYoIG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqMS5lcXVhbHMoIG9iajIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvT2JqZWN0UmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL09iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ0YmMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvT2JqZWN0UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdFJlZmVyZW5jZTxUPgotewotICAgIHByaXZhdGUgVCBvYmplY3Q7Ci0gICAgCi0gICAgcHVibGljIE9iamVjdFJlZmVyZW5jZSgpCi0gICAgewotICAgICAgICB0aGlzLm9iamVjdCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UoIGZpbmFsIFQgb2JqZWN0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVCBnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXQoIGZpbmFsIFQgb2JqZWN0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUGx1Z2luVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9QbHVnaW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjY0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9QbHVnaW5VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyB0aGF0IGFyZSBoZWxwZnVsIGZvciBpbXBsZW1lbnRpbmcgZXh0ZW5zaW9uIHBvaW50cy4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUGx1Z2luVXRpbAotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotCi0gICAgICAgIGV4dGVuZHMgRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBQbHVnaW5VdGlsKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SUV4dGVuc2lvbj4gZmluZEV4dGVuc2lvbnMoIGZpbmFsIFN0cmluZyBwbHVnaW5JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHRlbnNpb25Qb2ludElkICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIGZpbmFsIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KCBwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnRJZCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHBvaW50ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PElFeHRlbnNpb24+IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0PElFeHRlbnNpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElFeHRlbnNpb24gZXh0ZW5zaW9uIDogcG9pbnQuZ2V0RXh0ZW5zaW9ucygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGQoIGV4dGVuc2lvbiApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPElDb25maWd1cmF0aW9uRWxlbWVudD4gZ2V0VG9wTGV2ZWxFbGVtZW50cyggZmluYWwgQ29sbGVjdGlvbjxJRXh0ZW5zaW9uPiBleHRlbnNpb25zICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoIGVsZW1lbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRNaXNzaW5nQXR0cmlidXRlKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBsdWdpbklkID0gZWwuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHRQb2ludElkID0gZWwuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICA9IFJlc291cmNlcy5iaW5kKCBSZXNvdXJjZXMubWlzc2luZ0F0dHJpYnV0ZSwgcGx1Z2luSWQsIGV4dFBvaW50SWQsIGVsLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgKTsKLQotICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwb3J0TWlzc2luZ0VsZW1lbnQoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbGVtZW50ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW5JZCA9IGVsLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXh0UG9pbnRJZCA9IGVsLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgPSBSZXNvdXJjZXMuYmluZCggUmVzb3VyY2VzLm1pc3NpbmdFbGVtZW50LCBwbHVnaW5JZCwgZXh0UG9pbnRJZCwgZWwuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgKTsKLQotICAgICAgICBGYWNldENvcmVQbHVnaW4ubG9nKCBtc2cgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGUgKQotCi0gICAgICAgIHRocm93cyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uCi0KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSBlbC5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApOwotCi0gICAgICAgIGlmKCB2YWwgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoIGVsLCBhdHRyaWJ1dGUgKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXh0ZW5zaW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZpbmRSZXF1aXJlZEVsZW1lbnQoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGRFbGVtZW50ICkKLQotICAgICAgICB0aHJvd3MgSW52YWxpZEV4dGVuc2lvbkV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsLmdldENoaWxkcmVuKCBjaGlsZEVsZW1lbnQgKTsKLQotICAgICAgICBpZiggY2hpbGRyZW4ubGVuZ3RoID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRNaXNzaW5nRWxlbWVudCggZWwsIGNoaWxkRWxlbWVudCApOwotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFeHRlbnNpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaGlsZHJlblsgMCBdOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZpbmRPcHRpb25hbEVsZW1lbnQoIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hpbGRFbGVtZW50ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gZWwuZ2V0Q2hpbGRyZW4oIGNoaWxkRWxlbWVudCApOwotCi0gICAgICAgIGlmKCBjaGlsZHJlbi5sZW5ndGggPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuWyAwIF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFZhbHVlKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlICkKLSAgICB7Ci0gICAgICAgIGlmKCBlbCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBlbC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGV4dCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHRleHQubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGluc3RhbnRpYXRlKCBmaW5hbCBTdHJpbmcgcGx1Z2luSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczxUPiBpbnRlcmZjICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCBwbHVnaW5JZCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgT2JqZWN0IG9iajsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBjbCA9IGJ1bmRsZS5sb2FkQ2xhc3MoIGNsbmFtZSApOwotICAgICAgICAgICAgb2JqID0gY2wubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoIFJlc291cmNlcy5mYWlsZWRUb0NyZWF0ZSwgY2xuYW1lICk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2csIGUgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggISBpbnRlcmZjLmlzQXNzaWduYWJsZUZyb20oIG9iai5nZXRDbGFzcygpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnCi0gICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmRvZXNOb3RJbXBsZW1lbnQsIGNsbmFtZSwgaW50ZXJmYy5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2cgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKFQpIG9iajsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0KLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdBdHRyaWJ1dGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdFbGVtZW50OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRUb0NyZWF0ZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZG9lc05vdEltcGxlbWVudDsKLSAgICAKLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVNZXNzYWdlcyggUGx1Z2luVXRpbC5jbGFzcy5nZXROYW1lKCksIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzQgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmluZCggbWVzc2FnZSwgbmV3IE9iamVjdFtdIHsgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCB9ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1BsdWdpblV0aWwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUGx1Z2luVXRpbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDczNDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUGx1Z2luVXRpbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1taXNzaW5nQXR0cmlidXRlID0gRXh0ZW5zaW9uIGVsZW1lbnQgPHsyfT4gaXMgbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgInszfSIuIFtwbHVnaW46ICJ7MH0iOyBleHRlbnNpb24gcG9pbnQ6ICJ7MX0iXQotbWlzc2luZ0VsZW1lbnQgPSBFeHRlbnNpb24gZWxlbWVudCA8ezJ9PiBpcyBtaXNzaW5nIHJlcXVpcmVkIGNoaWxkIGVsZW1lbnQgPHszfT4uIFtwbHVnaW46ICJ7MH0iOyBleHRlbnNpb24gcG9pbnQ6ICJ7MX0iXQotZmFpbGVkVG9DcmVhdGUgPSBGYWlsZWQgdG8gaW5zdGFudGlhdGUgY2xhc3MgezB9LgotZG9lc05vdEltcGxlbWVudCA9IENsYXNzIHswfSBkb2VzIG5vdCBpbXBsZW1lbnQgezF9IGludGVyZmFjZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvUHJvZ3Jlc3NNb25pdG9yVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9Qcm9ncmVzc01vbml0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MDRiMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9Qcm9ncmVzc01vbml0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9ncmVzc01vbml0b3JVdGlsIAotewotICAgIHByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yVXRpbCgpIHt9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZ2luVGFzayggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YXNrTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG90YWxXb3JrICkKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggdGFza05hbWUsIHRvdGFsV29yayApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3b3JrZWQoIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd29yayApCi0gICAgewotICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIHdvcmsgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9uZSggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3Igc3VibW9uKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGlja3MgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN1Ym1vbiggcGFyZW50LCB0aWNrcywgU3ViUHJvZ3Jlc3NNb25pdG9yLlNVUFBSRVNTX1NVQlRBU0tfTEFCRUwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3Igc3VibW9uKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGlja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0eWxlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoIHBhcmVudCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoIHBhcmVudCwgdGlja3MsIHN0eWxlICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN1YlRhc2soIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRhc2tOYW1lICkKLSAgICB7Ci0gICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soIHRhc2tOYW1lICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrSWZDYW5jZWxlZCggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAKLSAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1N0YXR1c1dyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvU3RhdHVzV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI1ZDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvU3RhdHVzV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyYXAgYW4gZXhpc3Rpbmcgc3RhdHVzIG9iamVjdCBhbmQgb3ZlcnJpZGUKLSAqIHRoZSBzdGF0dXMgY29kZS4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFN0YXR1c1dyYXBwZXIKLQotICAgIGltcGxlbWVudHMgSVN0YXR1cwotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSVN0YXR1cyBiYXNlOwotICAgIHByaXZhdGUgSW50ZWdlciBjb2RlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgU3RhdHVzV3JhcHBlciggZmluYWwgSVN0YXR1cyBzdGF0dXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlID0gc3RhdHVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvZGUoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuY29kZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29kZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0Q29kZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENvZGUoIGZpbmFsIGludCBjb2RlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMubWVzc2FnZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQbHVnaW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQbHVnaW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFNldmVyaXR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0U2V2ZXJpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJhc2UuaXNNdWx0aVN0YXR1cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT0soKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5pc09LKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyggZmluYWwgaW50IHNldmVyaXR5TWFzayApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5iYXNlLm1hdGNoZXMoIHNldmVyaXR5TWFzayApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVW5rbm93blZlcnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVW5rbm93blZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzNWMyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1Vua25vd25WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbmtub3duVmVyc2lvbjxUIGV4dGVuZHMgSVZlcnNpb24+Ci0KLSAgICBpbXBsZW1lbnRzIElWZXJzaW9uCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uYWJsZTxUPiB2ZXJzaW9uYWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uU3RyaW5nOwotICAgIAotICAgIHB1YmxpYyBVbmtub3duVmVyc2lvbiggZmluYWwgVmVyc2lvbmFibGU8VD4gdmVyc2lvbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvblN0cmluZyApCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb25hYmxlID0gdmVyc2lvbmFibGU7Ci0gICAgICAgIHRoaXMudmVyc2lvblN0cmluZyA9IHZlcnNpb25TdHJpbmc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKCBmaW5hbCBPYmplY3Qgb2JqICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gY29tcCA9IHRoaXMudmVyc2lvbmFibGUuZ2V0VmVyc2lvbkNvbXBhcmF0b3IoKTsKLSAgICAgICAgICAgIHJldHVybiBjb21wLmNvbXBhcmUoIHRoaXMudmVyc2lvblN0cmluZywgKCAoSVZlcnNpb24pIG9iaiAgKS5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uRXhwci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uRXhwci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIwMzhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbkV4cHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVZlcnNpb25FeHByOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVmVyc2lvbkV4cHI8VCBleHRlbmRzIElWZXJzaW9uPgotCi0gICAgaW1wbGVtZW50cyBJVmVyc2lvbkV4cHIKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU00xX1NUQVJUID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU00xX1BBUlNJTkdfU1RBUlRfVkVSU0lPTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMV9QQVJTSU5HX0VORF9WRVJTSU9OID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU00xX0ZJTklTSEVEX1JBTkdFX0lOQ0xVU0lWRSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMV9GSU5JU0hFRF9SQU5HRV9FWENMVVNJVkUgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTTFfUEFSU0lOR19XSUxEQ0FSRCA9IDU7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMl9WRVJTSU9OX1NUQVJUID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU00yX1ZFUlNJT05fQ09OVElOVUlORyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNMl9FU0NBUEUgPSAyOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbmFibGU8VD4gdmVyc2lvbmFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElTdWJFeHByPiBzdWJleHByczsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VkSW5QbHVnaW47Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgVmVyc2lvbkV4cHIoIGZpbmFsIE9iamVjdCB2ZXJzaW9uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVzZWRJblBsdWdpbiApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcyggKFZlcnNpb25hYmxlPFQ+KSB2ZXJzaW9uYWJsZSwgZXhwciwgdXNlZEluUGx1Z2luICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBWZXJzaW9uRXhwciggZmluYWwgVmVyc2lvbmFibGU8VD4gdmVyc2lvbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VkSW5QbHVnaW4gKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyc2lvbmFibGUgPSB2ZXJzaW9uYWJsZTsKLSAgICAgICAgdGhpcy5zdWJleHBycyA9IG5ldyBBcnJheUxpc3Q8SVN1YkV4cHI+KCk7Ci0gICAgICAgIHRoaXMudXNlZEluUGx1Z2luID0gdXNlZEluUGx1Z2luOwotICAgICAgICAKLSAgICAgICAgaW50IHN0YXRlID0gU00xX1NUQVJUOwotICAgICAgICBSYW5nZSByYW5nZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gdXNpbmdEZXByZWNhdGVkU3ludGF4ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBmb3IoIE11dGFibGVJbnRlZ2VyIHBvc2l0aW9uID0gbmV3IE11dGFibGVJbnRlZ2VyKCk7IAotICAgICAgICAgICAgIHBvc2l0aW9uLnZhbHVlIDwgZXhwci5sZW5ndGgoKTsgcG9zaXRpb24udmFsdWUrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBleHByLmNoYXJBdCggcG9zaXRpb24udmFsdWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3dpdGNoKCBzdGF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTFfU1RBUlQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggY2ggPT0gJ1snICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmluY2x1ZGVzU3RhcnRWZXJzaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU00xX1BBUlNJTkdfU1RBUlRfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnKCcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5jbHVkZXNTdGFydFZlcnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU00xX1BBUlNJTkdfU1RBUlRfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnKicgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YmV4cHJzLmFkZCggbmV3IFdpbGRjYXJkKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU00xX1BBUlNJTkdfV0lMRENBUkQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJyAnIHx8IGNoID09ICcsJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleGl0U3RhdGUgPSBwYXJzZVZlcnNpb24oIGV4cHIsIHBvc2l0aW9uLCBidWYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGV4aXRTdGF0ZSA9PSBTTTFfU1RBUlQgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2c3RyID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmFuZ2UgciA9IG5ldyBSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2c3RyLnN0YXJ0c1dpdGgoICI+PSIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3RhcnRWZXJzaW9uID0gcGFyc2VWZXJzaW9uKCB2c3RyLnN1YnN0cmluZyggMiApICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaW5jbHVkZXNTdGFydFZlcnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0RlcHJlY2F0ZWRTeW50YXggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB2c3RyLnN0YXJ0c1dpdGgoICI+IiApICkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zdGFydFZlcnNpb24gPSBwYXJzZVZlcnNpb24oIHZzdHIuc3Vic3RyaW5nKCAxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmNsdWRlc1N0YXJ0VmVyc2lvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0RlcHJlY2F0ZWRTeW50YXggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB2c3RyLnN0YXJ0c1dpdGgoICI8PSIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZW5kVmVyc2lvbiA9IHBhcnNlVmVyc2lvbiggdnN0ci5zdWJzdHJpbmcoIDIgKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmluY2x1ZGVzRW5kVmVyc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nRGVwcmVjYXRlZFN5bnRheCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHZzdHIuc3RhcnRzV2l0aCggIjwiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmVuZFZlcnNpb24gPSBwYXJzZVZlcnNpb24oIHZzdHIuc3Vic3RyaW5nKCAxICkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmNsdWRlc0VuZFZlcnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdEZXByZWNhdGVkU3ludGF4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zdGFydFZlcnNpb24gPSBwYXJzZVZlcnNpb24oIHZzdHIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmNsdWRlc1N0YXJ0VmVyc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZW5kVmVyc2lvbiA9IHIuc3RhcnRWZXJzaW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmluY2x1ZGVzRW5kVmVyc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ViZXhwcnMuYWRkKCByICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBleGl0U3RhdGUgPT0gU00xX0ZJTklTSEVEX1JBTkdFX0lOQ0xVU0lWRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlID09IFNNMV9GSU5JU0hFRF9SQU5HRV9FWENMVVNJVkUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kVmVyc2lvbiA9IHBhcnNlVmVyc2lvbiggYnVmLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGV4aXRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi52YWx1ZS0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRWZXJzaW9uRXhwckV4Y2VwdGlvbiggZXhwciApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTFfUEFSU0lOR19TVEFSVF9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGV4aXRTdGF0ZSA9IHBhcnNlVmVyc2lvbiggZXhwciwgcG9zaXRpb24sIGJ1ZiApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBleGl0U3RhdGUgPT0gU00xX1NUQVJUICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnRWZXJzaW9uID0gcGFyc2VWZXJzaW9uKCBidWYudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJleHBycy5hZGQoIHJhbmdlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGV4aXRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBleGl0U3RhdGUgPT0gU00xX1BBUlNJTkdfRU5EX1ZFUlNJT04gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5zdGFydFZlcnNpb24gPSBwYXJzZVZlcnNpb24oIGJ1Zi50b1N0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGV4aXRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRWZXJzaW9uRXhwckV4Y2VwdGlvbiggZXhwciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTFfUEFSU0lOR19FTkRfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleGl0U3RhdGUgPSBwYXJzZVZlcnNpb24oIGV4cHIsIHBvc2l0aW9uLCBidWYgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBleGl0U3RhdGUgPT0gU00xX0ZJTklTSEVEX1JBTkdFX0lOQ0xVU0lWRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlID09IFNNMV9GSU5JU0hFRF9SQU5HRV9FWENMVVNJVkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmRWZXJzaW9uID0gcGFyc2VWZXJzaW9uKCBidWYudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBleGl0U3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi52YWx1ZS0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlSW52YWxpZFZlcnNpb25FeHByRXhjZXB0aW9uKCBleHByICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNNMV9GSU5JU0hFRF9SQU5HRV9JTkNMVVNJVkU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTFfRklOSVNIRURfUkFOR0VfRVhDTFVTSVZFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5jbHVkZXNFbmRWZXJzaW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgPSAoIHN0YXRlID09IFNNMV9GSU5JU0hFRF9SQU5HRV9JTkNMVVNJVkUgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ViZXhwcnMuYWRkKCByYW5nZSApOwotICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNNMV9TVEFSVDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNNMV9QQVJTSU5HX1dJTERDQVJEOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNoID09ICcgJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICcsJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU00xX1NUQVJUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlSW52YWxpZFZlcnNpb25FeHByRXhjZXB0aW9uKCBleHByICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlcG9ydCB0aGUgdXNlIG9mIGRlcHJlY2F0ZWQgc3ludGF4LgotICAgICAgICAKLSAgICAgICAgaWYoIHVzaW5nRGVwcmVjYXRlZFN5bnRheCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2c7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLnVzZWRJblBsdWdpbiA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBSZXNvdXJjZXMuZGVwcmVjYXRlZFN5bnRheE5vUGx1Z2luOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZyA9IE5MUy5iaW5kKCBSZXNvdXJjZXMuZGVwcmVjYXRlZFN5bnRheCwgdGhpcy51c2VkSW5QbHVnaW4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmFjZXRDb3JlUGx1Z2luLmxvZ1dhcm5pbmcoIG1zZywgdHJ1ZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IHBhcnNlVmVyc2lvbiggZmluYWwgU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11dGFibGVJbnRlZ2VyIHBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHZlcnNpb24gKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGludCBsb2NhbFN0YXRlID0gU00yX1ZFUlNJT05fU1RBUlQ7Ci0gICAgICAgIGludCBleGl0U3RhdGUgPSAtMTsKLSAgICAgICAgCi0gICAgICAgIGZvciggOyBleGl0U3RhdGUgPT0gLTEgJiYgcG9zaXRpb24udmFsdWUgPCBzdHIubGVuZ3RoKCk7IAotICAgICAgICAgICAgIHBvc2l0aW9uLnZhbHVlKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gc3RyLmNoYXJBdCggcG9zaXRpb24udmFsdWUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3dpdGNoKCBsb2NhbFN0YXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNNMl9WRVJTSU9OX1NUQVJUOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNoID09ICdbJyB8fCBjaCA9PSAnKCcgfHwgY2ggPT0gJ10nIHx8IGNoID09ICcpJyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJy0nIHx8IGNoID09ICcsJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUludmFsaWRWZXJzaW9uRXhwckV4Y2VwdGlvbiggc3RyICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJ1xcJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RhdGUgPSBTTTJfRVNDQVBFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICcgJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5hcHBlbmQoIGNoICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0YXRlID0gU00yX1ZFUlNJT05fQ09OVElOVUlORzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU00yX1ZFUlNJT05fQ09OVElOVUlORzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBjaCA9PSAnWycgfHwgY2ggPT0gJygnICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlSW52YWxpZFZlcnNpb25FeHByRXhjZXB0aW9uKCBzdHIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnXFwnICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGF0ZSA9IFNNMl9FU0NBUEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJywnICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlID0gU00xX1NUQVJUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICctJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSA9IFNNMV9QQVJTSU5HX0VORF9WRVJTSU9OOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNoID09ICddJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSA9IFNNMV9GSU5JU0hFRF9SQU5HRV9JTkNMVVNJVkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY2ggPT0gJyknICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlID0gU00xX0ZJTklTSEVEX1JBTkdFX0VYQ0xVU0lWRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnICcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKCBjaCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTTTJfRVNDQVBFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5hcHBlbmQoIGNoICk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcG9zaXRpb24udmFsdWUtLTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBleGl0U3RhdGUgIT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXhpdFN0YXRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGxvY2FsU3RhdGUgPT0gU00yX1ZFUlNJT05fQ09OVElOVUlORyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZW5kIG9mIGlucHV0LgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBTTTFfU1RBUlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlSW52YWxpZFZlcnNpb25FeHByRXhjZXB0aW9uKCBzdHIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElWZXJzaW9uIHBhcnNlVmVyc2lvbiggZmluYWwgU3RyaW5nIHN0ciApCi0gICAgewotICAgICAgICBpZiggdGhpcy52ZXJzaW9uYWJsZS5oYXNWZXJzaW9uKCBzdHIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb25hYmxlLmdldFZlcnNpb24oIHN0ciApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmtub3duVmVyc2lvbjxUPiggdGhpcy52ZXJzaW9uYWJsZSwgc3RyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2soIGZpbmFsIElWZXJzaW9uIHZlciApCi0gICAgewotICAgICAgICBmb3IoIElTdWJFeHByIHN1YmV4cHIgOiB0aGlzLnN1YmV4cHJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHN1YmV4cHIuZXZhbHVhdGUoIHZlciApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSggZmluYWwgU3RyaW5nIHZlciApCi0gICAgewotICAgICAgICByZXR1cm4gY2hlY2soIHBhcnNlVmVyc2lvbiggdmVyICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW5nbGVWZXJzaW9uTWF0Y2goKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuc3ViZXhwcnMuc2l6ZSgpID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJU3ViRXhwciBzdWJFeHByID0gdGhpcy5zdWJleHBycy5nZXQoIDAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHN1YkV4cHIgaW5zdGFuY2VvZiBSYW5nZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSAoUmFuZ2UpIHN1YkV4cHI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHJhbmdlLnN0YXJ0VmVyc2lvbi5lcXVhbHMoIHJhbmdlLmVuZFZlcnNpb24gKSAmJgotICAgICAgICAgICAgICAgICAgICByYW5nZS5pbmNsdWRlc1N0YXJ0VmVyc2lvbiA9PSByYW5nZS5pbmNsdWRlc0VuZFZlcnNpb24gPT0gdHJ1ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZUFsbG93TmV3ZXIoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuc3ViZXhwcnMuc2l6ZSgpID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJU3ViRXhwciBzdWJFeHByID0gdGhpcy5zdWJleHBycy5nZXQoIDAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHN1YkV4cHIgaW5zdGFuY2VvZiBSYW5nZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSAoUmFuZ2UpIHN1YkV4cHI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcmFuZ2Uuc3RhcnRWZXJzaW9uICE9IG51bGwgJiYgcmFuZ2UuZW5kVmVyc2lvbiA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIHJhbmdlLmluY2x1ZGVzU3RhcnRWZXJzaW9uICApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaWxkY2FyZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5zdWJleHBycy5zaXplKCkgPT0gMSAmJiAKLSAgICAgICAgICAgICAgIHRoaXMuc3ViZXhwcnMuZ2V0KCAwICkgaW5zdGFuY2VvZiBXaWxkY2FyZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgaWYoIGlzU2luZ2xlVmVyc2lvbk1hdGNoKCkgfHwgaXNTaW1wbGVBbGxvd05ld2VyKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IChSYW5nZSkgdGhpcy5zdWJleHBycy5nZXQoIDAgKTsKLSAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggSVN1YkV4cHIgc3ViZXhwciA6IHRoaXMuc3ViZXhwcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggYnVmLmxlbmd0aCgpID4gMCApIGJ1Zi5hcHBlbmQoICcsJyApOwotICAgICAgICAgICAgYnVmLmFwcGVuZCggc3ViZXhwci50b1N0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoKQotICAgIHsKLSAgICAgICAgaWYoIHRoaXMuc3ViZXhwcnMuc2l6ZSgpID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJU3ViRXhwciBzdWJleHByID0gdGhpcy5zdWJleHBycy5nZXQoIDAgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHN1YmV4cHIgaW5zdGFuY2VvZiBSYW5nZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmFuZ2UgciA9IChSYW5nZSkgc3ViZXhwcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggci5pc1NpbmdsZVZlcnNpb24oKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5zdGFydFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCByLmVuZFZlcnNpb24gPT0gbnVsbCAmJiByLmluY2x1ZGVzU3RhcnRWZXJzaW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLnZlcnNpb25Pck5ld2VyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnN0YXJ0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIG9ubHlTaW5nbGVWZXJzaW9ucyA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElTdWJFeHByIHN1YmV4cHIgOiB0aGlzLnN1YmV4cHJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgKCBzdWJleHByIGluc3RhbmNlb2YgUmFuZ2UgKSB8fCAKLSAgICAgICAgICAgICAgICAhICggKFJhbmdlKSBzdWJleHByICkuaXNTaW5nbGVWZXJzaW9uKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9ubHlTaW5nbGVWZXJzaW9ucyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggb25seVNpbmdsZVZlcnNpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgZm9yKCBJdGVyYXRvcjxJU3ViRXhwcj4gaXRyID0gdGhpcy5zdWJleHBycy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmFuZ2UgciA9IChSYW5nZSkgaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggYnVmLmxlbmd0aCgpID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggaXRyLmhhc05leHQoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICIsICIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggIiBvciAiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCByLnN0YXJ0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjcmVhdGVJbnZhbGlkVmVyc2lvbkV4cHJFeGNlcHRpb24oIGZpbmFsIFN0cmluZyBzdHIgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmludmFsaWRWZXJzaW9uRXhwciwgc3RyICk7Ci0gICAgCi0gICAgICAgIGZpbmFsIElTdGF0dXMgc3QgPSBGYWNldENvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIG1zZyApOwotICAgIAotICAgICAgICByZXR1cm4gbmV3IENvcmVFeGNlcHRpb24oIHN0ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBJU3ViRXhwcgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBldmFsdWF0ZSggSVZlcnNpb24gdmVyc2lvbiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSYW5nZQotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElTdWJFeHByCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIElWZXJzaW9uIHN0YXJ0VmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVzU3RhcnRWZXJzaW9uID0gZmFsc2U7Ci0gICAgICAgIHB1YmxpYyBJVmVyc2lvbiBlbmRWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZXNFbmRWZXJzaW9uID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZVZlcnNpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydFZlcnNpb24uZXF1YWxzKCB0aGlzLmVuZFZlcnNpb24gKSAmJgotICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZXNTdGFydFZlcnNpb24gPT0gdGhpcy5pbmNsdWRlc0VuZFZlcnNpb24gPT0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoIGZpbmFsIElWZXJzaW9uIHZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5zdGFydFZlcnNpb24gIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcyA9IHZlcnNpb24uY29tcGFyZVRvKCB0aGlzLnN0YXJ0VmVyc2lvbiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCAhICggcmVzID4gMCB8fCAoIHJlcyA9PSAwICYmIHRoaXMuaW5jbHVkZXNTdGFydFZlcnNpb24gKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCB0aGlzLmVuZFZlcnNpb24gIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcyA9IHZlcnNpb24uY29tcGFyZVRvKCB0aGlzLmVuZFZlcnNpb24gKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggISAoIHJlcyA8IDAgfHwgKCByZXMgPT0gMCAmJiB0aGlzLmluY2x1ZGVzRW5kVmVyc2lvbiApICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5zdGFydFZlcnNpb24uZXF1YWxzKCB0aGlzLmVuZFZlcnNpb24gKSAmJgotICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZXNTdGFydFZlcnNpb24gPT0gdGhpcy5pbmNsdWRlc0VuZFZlcnNpb24gPT0gdHJ1ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0aGlzLnN0YXJ0VmVyc2lvbiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHRoaXMuaW5jbHVkZXNTdGFydFZlcnNpb24gPyAnWycgOiAnKCcgKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5zdGFydFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCB0aGlzLmVuZFZlcnNpb24gIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggYnVmLmxlbmd0aCgpICE9IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCAnLScgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggdGhpcy5lbmRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCB0aGlzLmluY2x1ZGVzRW5kVmVyc2lvbiA/ICddJyA6ICcpJyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgV2lsZGNhcmQKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJU3ViRXhwcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCBmaW5hbCBJVmVyc2lvbiB2ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSVZlcnNpb25FeHByLldJTERDQVJEX1NZTUJPTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNdXRhYmxlSW50ZWdlcgotICAgIHsKLSAgICAgICAgcHVibGljIGludCB2YWx1ZSA9IDA7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWZXJzaW9uRXhwcjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVwcmVjYXRlZFN5bnRheDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVwcmVjYXRlZFN5bnRheE5vUGx1Z2luOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uT3JOZXdlcjsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFZlcnNpb25FeHByLmNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1ZlcnNpb25FeHByLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1ZlcnNpb25FeHByLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGQyZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uRXhwci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotaW52YWxpZFZlcnNpb25FeHByID0gVmVyc2lvbiBleHByZXNzaW9uICJ7MH0iIGlzIGludmFsaWQuCi0KLWRlcHJlY2F0ZWRTeW50YXggPSBcCi1UaGUgIj4iLCAiPj0iLCAiPCIsIGFuZCAiPD0iIG5vdGF0aW9uIGluIHZlcnNpb24gZXhwcmVzc2lvbnMgaGFzIGJlZW4gXAotZGVwcmVjYXRlZC4gSXQgdXNlZCBpbiBwbHVnaW4gezB9LiBOb3RlIHRoYXQgdGhlIGFuZ2xlIGJyYWNrZXRzIGFyZSBcCi1yZXByZXNlbnRlZCB2aWEgIiZsdDsiIGFuZCAiJmd0OyIgaW4gdGhlIHBsdWdpbi54bWwgZmlsZXMuIFRoZSBmdW5jdGlvbmFsaXR5IFwKLWhhcyBiZWVuIHJlcGxhY2VkIHdpdGggcmFuZ2Ugbm90YXRpb24uIEZvciBpbnN0YW5jZSAiW1gtWSkiIG1lYW5zIGFsbCBcCi12ZXJzaW9ucyBncmVhdGVyIG9yIGVxdWFscyB0byBYIGFuZCBsZXNzIHRoYW4gWS4gT3BlbiByYW5nZXMgc3VjaCBhcyAiKFgiIG9yIFwKLSJZXSIgYXJlIGFsc28gYWxsb3dlZC4KLQotZGVwcmVjYXRlZFN5bnRheE5vUGx1Z2luID0gXAotVGhlICI+IiwgIj49IiwgIjwiLCBhbmQgIjw9IiBub3RhdGlvbiBpbiB2ZXJzaW9uIGV4cHJlc3Npb25zIGhhcyBiZWVuIFwKLWRlcHJlY2F0ZWQuIE5vdGUgdGhhdCB0aGUgYW5nbGUgYnJhY2tldHMgYXJlIFwKLXJlcHJlc2VudGVkIHZpYSAiJmx0OyIgYW5kICImZ3Q7IiBpbiB0aGUgcGx1Z2luLnhtbCBmaWxlcy4gVGhlIGZ1bmN0aW9uYWxpdHkgXAotaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCByYW5nZSBub3RhdGlvbi4gRm9yIGluc3RhbmNlICJbWC1ZKSIgbWVhbnMgYWxsIFwKLXZlcnNpb25zIGdyZWF0ZXIgb3IgZXF1YWxzIHRvIFggYW5kIGxlc3MgdGhhbiBZLiBPcGVuIHJhbmdlcyBzdWNoIGFzICIoWCIgb3IgXAotIlldIiBhcmUgYWxzbyBhbGxvd2VkLgotCi12ZXJzaW9uT3JOZXdlciA9IHswfSBvciBuZXdlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbmFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyZGRlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS91dGlsL2ludGVybmFsL1ZlcnNpb25hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkRlZmF1bHRWZXJzaW9uQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmVyc2lvbmFibGU8VCBleHRlbmRzIElWZXJzaW9uPgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBERUZBVUxUX1ZFUlNJT05fQ09NUEFSQVRPUgotICAgICAgICA9IG5ldyBEZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IoKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBJbmRleGVkU2V0PFN0cmluZyxUPiB2ZXJzaW9uczsKLSAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uQ29tcGFyYXRvckNsYXNzOwotICAgIHByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IHZlcnNpb25Db21wYXJhdG9yOwotICAgIAotICAgIHB1YmxpYyBWZXJzaW9uYWJsZSgpCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb25zID0gbmV3IEluZGV4ZWRTZXQ8U3RyaW5nLFQ+KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLSAgICAKLSAgICBwdWJsaWMgU2V0PFQ+IGdldFZlcnNpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb25zLmdldFVubW9kaWZpYWJsZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PFQ+IGdldFZlcnNpb25zKCBmaW5hbCBTdHJpbmcgZXhwciApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgVmVyc2lvbkV4cHI8VD4gcHJlcGFyZWQgPSBuZXcgVmVyc2lvbkV4cHI8VD4oIHRoaXMsIGV4cHIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgU2V0PFQ+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFQ+KCk7Ci0gICAgICAgICAKLSAgICAgICAgZm9yKCBUIHZlciA6IHRoaXMudmVyc2lvbnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcHJlcGFyZWQuY2hlY2soIHZlciApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCB2ZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFQgZ2V0VmVyc2lvbiggZmluYWwgU3RyaW5nIHZlcnNpb24gKQotICAgIHsKLSAgICAgICAgZmluYWwgVCB2ZXIgPSB0aGlzLnZlcnNpb25zLmdldCggdmVyc2lvbiApOwotICAgICAgICAKLSAgICAgICAgaWYoIHZlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggY3JlYXRlVmVyc2lvbk5vdEZvdW5kRXJyTXNnKCB2ZXJzaW9uICkgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHZlcjsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgVCBnZXRMYXRlc3RWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKCB0aGlzLnZlcnNpb25zLnNpemUoKSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMubWF4KCB0aGlzLnZlcnNpb25zICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNWZXJzaW9uKCBmaW5hbCBTdHJpbmcgdmVyc2lvbiApCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9ucy5jb250YWluc0tleSggdmVyc2lvbiApOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFQ+IGdldFNvcnRlZFZlcnNpb25zKCBmaW5hbCBib29sZWFuIGFzY2VuZGluZyApCi0gICAgewotICAgICAgICBDb21wYXJhdG9yPFQ+IGNvbXA7Ci0gICAgICAgIAotICAgICAgICBpZiggYXNjZW5kaW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgY29tcCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wID0gbmV3IENvbXBhcmF0b3I8VD4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKCBmaW5hbCBUIHZlcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUIHZlcjIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlcjEuY29tcGFyZVRvKCB2ZXIyICkgKiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPiggdGhpcy52ZXJzaW9ucyApOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KCBsaXN0LCBjb21wICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgQ29tcGFyYXRvcjxTdHJpbmc+IGdldFZlcnNpb25Db21wYXJhdG9yKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBDb21wYXJhdG9yPFN0cmluZz4gY29tcDsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnZlcnNpb25Db21wYXJhdG9yQ2xhc3MgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXAgPSBERUZBVUxUX1ZFUlNJT05fQ09NUEFSQVRPUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB0aGlzLnZlcnNpb25Db21wYXJhdG9yID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIGdldFBsdWdpbklkKCkgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGNsIAotICAgICAgICAgICAgICAgICAgICAgICAgPSBidW5kbGUubG9hZENsYXNzKCB0aGlzLnZlcnNpb25Db21wYXJhdG9yQ2xhc3MgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbkNvbXBhcmF0b3IgPSAoQ29tcGFyYXRvcjxTdHJpbmc+KSBjbC5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgPSBOTFMuYmluZCggUmVzb3VyY2VzLmZhaWxlZFRvQ3JlYXRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbkNvbXBhcmF0b3JDbGFzcyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVN0YXR1cyBzdCAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gRmFjZXRDb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBtc2csIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBzdCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29tcCA9IHRoaXMudmVyc2lvbkNvbXBhcmF0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjb21wOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uQ29tcGFyYXRvciggZmluYWwgU3RyaW5nIGNsbmFtZSApCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb25Db21wYXJhdG9yQ2xhc3MgPSBjbG5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY3JlYXRlVmVyc2lvbk5vdEZvdW5kRXJyTXNnKCBTdHJpbmcgdmVyc3RyICk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgCi0gICAgICAgIGV4dGVuZHMgTkxTCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkVG9DcmVhdGU7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBWZXJzaW9uYWJsZS5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuY2xhc3MgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uYWJsZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9WZXJzaW9uYWJsZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDIxOWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvVmVyc2lvbmFibGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZhaWxlZFRvQ3JlYXRlID0gRmFpbGVkIHRvIGluc3RhbnRpYXRlIGNsYXNzIHswfS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvaW50ZXJuYWwvWG1sVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9YbWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjRiZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdXRpbC9pbnRlcm5hbC9YbWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIFhtbFV0aWwKLXsKLSAgICBwcml2YXRlIFhtbFV0aWwoKSB7fQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZSggZmluYWwgU3RyaW5nIHN0cmluZyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IHN0cmluZy5sZW5ndGgoKTsgaSA8IG47IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBzdHJpbmcuY2hhckF0KCBpICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjaCA9PSAnPCcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICImbHQ7IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnPicgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICImZ3Q7IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnJicgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICImYW1wOyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIGNoICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlZTI2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9Ii5kby1ub3QtZGVsZXRlIiBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMThkNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI5ZTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3ZmE3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1jdXN0b21CdWlsZENhbGxiYWNrcyA9IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotY3VzdG9tQnVpbGRDYWxsYmFja3MuZmFpbG9uZXJyb3IgPSB0cnVlCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGd1aWRlLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwsXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjFmMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBidWlsZC5qYXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSBmb2xkZXIgdG8gY29udGFpbiB0aGUgYnVpbGQgcmVzdWx0cyAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgYnVpbGQuamFycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuYnVpbGQuamFycyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGJ1aWxkLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciB0byBjb250YWluIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBidWlsZC5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIHRvIGNvbnRhaW4gdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5idWlsZC5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiB0YXJnZXQgPG5hbWU+ICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gU3Vic3RpdHV0ZSAibmFtZSIgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LCBlZyBAZG90ICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBzb3VyY2UuZm9sZGVybiA6IG4gPSAxIC4uLiBOLCB0aGUgc291cmNlIGZvbGRlcnMgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyICA6IHdoZXJlIHRoZSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiBnbyAgICAgICAgICAgIC0tPgotCTwhLS0gICA8bmFtZT4uY2xhc3NwYXRoIDogbmFtZSA9IG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHRhcmdldC4gQSAgICAgICAgIC0tPgotCTwhLS0gICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoZSBjbGFzc3BhdGggc3RydWN0dXJlLiAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLkBkb3QiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIHRhcmdldCA8bmFtZT4sIGFmdGVyIHRoZSBjb21waWxlICAgLS0+Ci0JPCEtLSBidXQgYmVmb3JlIGphcmluZy4gIFN1YnN0aXR1dGUgIm5hbWUiIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uLS0+Ci0JPCEtLSB0YXJnZXQsIGVnIEBkb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHNvdXJjZS5mb2xkZXJuIDogbiA9IDEgLi4uIE4sIHRoZSBzb3VyY2UgZm9sZGVycyAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRhcmdldC5mb2xkZXIgIDogd2hlcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXBpbGF0aW9uIGdvICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIDxuYW1lPi5jbGFzc3BhdGggOiBuYW1lID0gbmFtZSBvZiB0aGUgY29tcGlsYXRpb24gdGFyZ2V0LiBBICAgICAgICAgLS0+Ci0JPCEtLSAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhlIGNsYXNzcGF0aCBzdHJ1Y3R1cmUuICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNvbXBpbGUuQGRvdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSBjb21waWxhdGlvbiB0YXJnZXQgPG5hbWU+ICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIFN1YnN0aXR1dGUgIm5hbWUiIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHRhcmdldCwgZWcgQGRvdCAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgamFyLmxvY2F0aW9uIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21waWxhdGlvbiByZXN1bHRzICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgPG5hbWU+LmNsYXNzcGF0aCA6IG5hbWUgPSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB0YXJnZXQuIEEgICAgICAgICAtLT4KLQk8IS0tICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0byB0aGUgY2xhc3NwYXRoIHN0cnVjdHVyZS4gICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCTx0YXJnZXQgbmFtZT0icG9zdC5AZG90Ij4KLQkJPGFudAotCQkgIGFudGZpbGU9ImphdmFkb2MueG1sIgotCQkgIHRhcmdldD0iZXhwb3J0LWphdmFkb2MiCi0JCSAgaW5oZXJpdEFsbD0idHJ1ZSIKLQkJICBpbmhlcml0UmVmcz0idHJ1ZSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgYnVpbGQucmVzdWx0LmZvbGRlciAtIGZvbGRlciBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHRzICAgICAgICAgICAtLT4KLQk8IS0tICAgdGFyZ2V0LmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBidWlsZC5yZXN1bHQuZm9sZGVyIC0gZm9sZGVyIGNvbnRhaW5pbmcgdGhlIGJ1aWxkIHJlc3VsdHMgICAgICAgICAgIC0tPgotCTwhLS0gICB0YXJnZXQuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLnNvdXJjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5zb3VyY2VzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gICBkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciAtIGRlc3RpbmF0aW9uIGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuc291cmNlcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSB0aGUgdGFyZ2V0IGdhdGhlci5sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZS5nYXRoZXIubG9ncyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSB0YXJnZXQgZ2F0aGVyLmxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tIEF2YWlsYWJsZSBwYXJhbWV0ZXJzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICAgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgLSBkZXN0aW5hdGlvbiBmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3QuZ2F0aGVyLmxvZ3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgdGhlIHRhcmdldCBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gZGVzdGluYXRpb24gZm9sZGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmUuY2xlYW4iPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgdGFyZ2V0IGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSBBdmFpbGFibGUgcGFyYW1ldGVycyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHBsdWdpbi5kZXN0aW5hdGlvbiAtIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBidWlsZCAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIGJ1aWxkLnJlc3VsdC5mb2xkZXIgLSByZXN1bHRzIG9mIHRoZSBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSAgIHRlbXAuZm9sZGVyIC0gdGVtcG9yYXJ5IGZvbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0LmNsZWFuIj4KLQk8L3RhcmdldD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZGVzY3JpcHRpb24uaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZGVzY3JpcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjOGE2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2Rlc2NyaXB0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+Q2hlY2tpbmcgV1RQIG91dDwvdGl0bGU+Ci08bGluawotICByZWw9InN0eWxlc2hlZXQiCi0gIHR5cGU9InRleHQvY3NzIgotICBocmVmPSJmb3JtYXQuY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08cCBjbGFzcz0idWViZXJzY2hyaWZ0Ij5GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrPC9wPgotCi08cD5UaGUgRmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yayBhbGxvd3MgdGhlIHBsdWdpbiBkZXZlbG9wZXIgdG8gdGhpbmsgb2YgCi1wcm9qZWN0cyBhcyBjb21wb3NlZCBvZiB1bml0cyBvZiBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2Uga25vd24gYXMgZmFjZXRzLCB0aGF0IAotY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGJ5IHRoZSB1c2VyLjwvcD4KLQotPHA+UHJvamVjdCBmYWNldHMgYXJlIG1vc3QgZnJlcXVlbnRseSB1c2VkIGZvciBhZGRpbmcgbmF0dXJlcywgYnVpbGRlcnMsIAotY2xhc3NwYXRoIGVudHJpZXMsIGFuZCByZXNvdXJjZXMgdG8gYSBwcm9qZWN0LjwvcD4KLQotPHA+UHJpbWFyeSBCZW5lZml0czwvcD4KLQotPHVsPgotICA8bGk+Q29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UuPC9saT4KLSAgPGxpPkFiaWxpdHkgdG8gYWNjdXJhdGVseSBkZXNjcmliZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHJ1bnRpbWUgcGxhdGZvcm0uPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2Rvd25sb2Fkcy9lbmFibGVtZW50LWV4YW1wbGUuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2U3Yzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2VuYWJsaW5nLWJhc2VkLW9uLWZhY2V0cy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS9lbmFibGluZy1iYXNlZC1vbi1mYWNldHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjZTM2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2VuYWJsaW5nLWJhc2VkLW9uLWZhY2V0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotICAKLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPHRpdGxlPkVuYWJsaW5nIFVJIEVsZW1lbnRzIEJhc2VkIG9uIFByb2plY3QgRmFjZXRzPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idHV0b3JpYWwvdHV0b3JpYWwuY3NzIi8+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDEgYWxpZ249ImNlbnRlciI+RW5hYmxpbmcgVUkgRWxlbWVudHMgQmFzZWQgb24gUHJvamVjdCBGYWNldHM8L2gxPgotCi08cD5Vc2VyIGludGVyZmFjZSBlbGVtZW50cyBvZnRlbiBuZWVkIHRvIGJlIHNlbGVjdGl2ZWx5IGVuYWJsZWQgYmFzZWQgb24gdGhlCi1wcmVzZW5jZSBvZiBhIGZhY2V0IGluIGEgcHJvamVjdC4gVGhlIHR3byBtb3N0IGNvbW1vbiBleGFtcGxlcyBhcmUgcHJvamVjdCAKLXByb3BlcnRpZXMgcGFnZXMgYW5kIG1lbnUgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBmYWNldC4gVGhlIEZhY2V0ZWQgUHJvamVjdAotRnJhbWV3b3JrIHByb3ZpZGVzIGEgd2F5IHRvIGRvIHRoYXQgdmlhIGEgcHJvcGVydHkgdGVzdGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4KLWFueSBleHRlbnNpb24gcG9pbnQgdGhhdCBzdXBwb3J0cyB0aGUgRWNsaXBzZSBQbGF0Zm9ybSdzIGNvbW1vbiBleHByZXNzaW9uCi1sYW5ndWFnZS48L3A+Ci0KLTxwPgotICA8Yj5Qcm9wZXJ0eSBOYW1lOjwvYj4gPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9jb2RlPjxici8+Ci0gIDxiPlByb3BlcnR5IFZhbHVlOjwvYj4gPGNvZGU+W2ZhY2V0LmlkXSg6W3ZlcnNpb24uZXhwcl0pPzwvY29kZT4KLTwvcD4KLQotPHA+QXMgeW91IGNhbiBzZWUgZnJvbSB0aGUgZm9ybWF0IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgeW91IGNhbiBlaXRoZXIgdGVzdAotdXNpbmcganVzdCB0aGUgcHJvamVjdCBmYWNldCBpZCBvciB5b3UgY2FuIGFsc28gaW5jbHVkZSBhIHZlcnNpb24gZXhwcmVzc2lvbiBpZgotb25seSBjZXJ0YWluIHZlcnNpb25zIHNob3VsZCBiZSBtYXRjaGVkLjwvcD4KLQotPHA+VGhlIGZvbGxvd2luZyB0d28gZXhhbXBsZXMgZGVtb25zdHJhdGUgaG93IHRoZSBmYWNldHMgcHJvcGVydHkgdGVzdGVyIGNhbiBiZQotdXNlZC4gVG8gZXhwbG9yZSBmdXJ0aGVyLCB5b3UgY2FuIGFsc28gZG93bmxvYWQgdGhlIAotPGEgaHJlZj0iZG93bmxvYWRzL2VuYWJsZW1lbnQtZXhhbXBsZS56aXAiPmNvbXBsZXRlIHJ1bm5hYmxlIHNvdXJjZTwvYT4gb2YgdGhlc2UKLWV4YW1wbGVzLjwvcD4KLQotPHA+PGI+RXhhbXBsZSAxPC9iPjwvcD4KLQotPHA+RW5hYmxlcyBhIHByb2plY3QgcHJvcGVydGllcyBwYWdlIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGZhY2V0LiBOb3RlIHRoZQotdXNlIG9mIHRoZSA8Y29kZT5mb3JjZVBsdWdpbkFjdGl2YXRpb248L2NvZGU+IGF0dHJpYnV0ZS4gVGhpcyBhdHRyaWJ1dGUgbWFrZXMKLXN1cmUgdGhhdCB0aGUgcHJvcGVydHkgdGVzdGVyIHdpbGwgYmUgaW52b2tlZCBldmVuIGlmIHRoZSBGYWNldGVkIFByb2plY3QKLUZyYW1ld29yayBwbHVnaW5zIGhhdmUgbm90IGJlZW4gYWN0aXZhdGVkIHlldC4gT21pdHRpbmcgdGhpcyBhdHRyaWJ1dGUgd2lsbCBjYXVzZQotdGhlIHRlc3QgZXhwcmVzc2lvbiB0byByZXR1cm4gZmFsc2UgaW4gdGhhdCBzaXR1YXRpb24uIEFsc28gbm90ZSB0aGUgdXNlIG9mIHRoZQotPGNvZGU+YWRhcHQ8L2NvZGU+IG9wZXJhdG9yIHRvIGFkYXB0IHRoZSBvYmplY3QgdG8gPGNvZGU+SVByb2plY3Q8L2NvZGU+LiBUaGlzCi1pcyBuZWNlc3NhcnkgYXMgc29tZSB2aWV3cyBtYXkgcmVwcmVzZW50IHByb2plY3QgZW50aXRpZXMgdXNpbmcgb3RoZXIgdHlwZXMuIEZvcgotaW5zdGFuY2UsIGluIHRoZSBKRFQncyBQYWNrYWdlIEV4cGxvcmVyIHRoZSBwcm9qZWN0cyBhcmUgaW5zdGFuY2VzIG9mCi08Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q8L2NvZGU+LjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlczwvc3Bhbj4iJmd0OwotICAmbHQ7cGFnZQotICAgIGlkPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5FeGFtcGxlRmFjZXRQcm9wZXJ0aWVzUGFnZTwvc3Bhbj4iCi0gICAgb2JqZWN0Q2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0PC9zcGFuPiIKLSAgICBhZGFwdGFibGU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPnRydWU8L3NwYW4+IgotICAgIG5hbWU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkV4YW1wbGUgRmFjZXQgUHJvcGVydGllczwvc3Bhbj4iCi0gICAgY2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LmV4YW1wbGVzLmVuYWJsZW1lbnQuRXhhbXBsZUZhY2V0UHJvcGVydGllc1BhZ2U8L3NwYW4+IiZndDsKLSAgICAmbHQ7ZW5hYmxlZFdoZW4mZ3Q7Ci0gICAgICAmbHQ7YWRhcHQgdHlwZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q8L3NwYW4+IiZndDsKLSAgICAgICAgJmx0O3Rlc3QgCi0gICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij50cnVlPC9zcGFuPiIKLSAgICAgICAgICBwcm9wZXJ0eT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9zcGFuPiIKLSAgICAgICAgICB2YWx1ZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+ZXhhbXBsZS5mYWNldDE8L3NwYW4+Ii8mZ3Q7Ci0gICAgICAmbHQ7L2FkYXB0Jmd0OwotICAgICZsdDsvZW5hYmxlZFdoZW4mZ3Q7ICAgICAgICAgIAotICAmbHQ7L3BhZ2UmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDs8L3ByZT4KLTwvZGl2PgotCi08cD48Yj5FeGFtcGxlIDI8L2I+PC9wPgotCi08cD5FbmFibGVzIGEgbWVudSBhY3Rpb24gaWYgZWl0aGVyIG9uZSBvZiB0aGUgdHdvIGZhY2V0cyBzcGVjaWZpZWQgaXMgaW5zdGFsbGVkCi1pbiBhIHByb2plY3QuIE5vdGUgdGhlIHVzZSBvZiBhIHZlcnNpb24gZXhwcmVzc2lvbiB0byBtYXRjaCBvbmx5IGNlcnRhaW4gdmVyc2lvbnMuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzPC9zcGFuPiImZ3Q7Ci0gICZsdDtvYmplY3RDb250cmlidXRpb24KLSAgICBpZD0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+ZXhhbXBsZUZhY2V0UG9wdXA8L3NwYW4+IgotICAgIG9iamVjdENsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDwvc3Bhbj4iCi0gICAgYWRhcHRhYmxlPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij50cnVlPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2FjdGlvbgotICAgICAgaWQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmV4YW1wbGVGYWNldFBvcHVwQWN0aW9uPC9zcGFuPiIKLSAgICAgIGxhYmVsPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5FeGFtcGxlIEZhY2V0IFBvcHVwPC9zcGFuPiIKLSAgICAgIGNsYXNzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5vcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5leGFtcGxlcy5lbmFibGVtZW50LkV4YW1wbGVGYWNldFBvcHVwQWN0aW9uPC9zcGFuPiIKLSAgICAgIG1lbnViYXJQYXRoPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5hZGRpdGlvbnM8L3NwYW4+IgotICAgICAgZW5hYmxlc0Zvcj0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Kzwvc3Bhbj4iJmd0OwotICAgICZsdDsvYWN0aW9uJmd0OwotICAgICZsdDtlbmFibGVtZW50Jmd0OwotICAgICAgJmx0O2FkYXB0IHR5cGU9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0PC9zcGFuPiImZ3Q7Ci0gICAgICAgICZsdDtvciZndDsKLSAgICAgICAgICAmbHQ7dGVzdCAKLSAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+dHJ1ZTwvc3Bhbj4iCi0gICAgICAgICAgICBwcm9wZXJ0eT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9zcGFuPiIKLSAgICAgICAgICAgIHZhbHVlPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5leGFtcGxlLmZhY2V0MToxLjA8L3NwYW4+Ii8mZ3Q7Ci0gICAgICAgICAgJmx0O3Rlc3QgCi0gICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPnRydWU8L3NwYW4+IgotICAgICAgICAgICAgcHJvcGVydHk9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldDwvc3Bhbj4iCi0gICAgICAgICAgICB2YWx1ZT0iPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+ZXhhbXBsZS5mYWNldDI6WzEuMS0yLjJdPC9zcGFuPiIvJmd0OwotICAgICAgICAmbHQ7L29yJmd0OwotICAgICAgJmx0Oy9hZGFwdCZndDsKLSAgICAmbHQ7L2VuYWJsZW1lbnQmZ3Q7Ci0gICZsdDsvb2JqZWN0Q29udHJpYnV0aW9uJmd0OyAgCi0mbHQ7L2V4dGVuc2lvbiZndDs8L3ByZT4KLTwvZGl2PgotCi08YnIvPjxici8+PGJyLz48YnIvPgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZm9ybWF0LmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvZm9ybWF0LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyNjI1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2Zvcm1hdC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDU1MgRG9jdW1lbnQgKi8KLWJvZHkgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmCi19Ci0KLS51ZWJlcnNjaHJpZnQgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogeC1sYXJnZTsKLQltYXJnaW4tdG9wOiAyMHB4OwotfQotCi0uY29kZSB7Ci0JZm9udC1mYW1pbHk6IENvdXJpZXIsICJDb3VyaWVyIE5ldyIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbGluZS1oZWlnaHQ6IDE2cHg7Ci0JY29sb3I6ICMwNDY3QjQ7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQlwYWRkaW5nOiA1cHggN3B4IDVweCAxM3B4OwotCWJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwotfQotCi0ubm90ZSB7Ci0JZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS5kZXNjcmlwdGlvbiB7Ci0JZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7Ci0JZm9udC1zaXplOiB4eC1sYXJnZTsKLX0KLQotLnNjaGVtYSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCWZvbnQtc2l6ZTogbGFyZ2UKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2xpc3RlbmVycy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS9saXN0ZW5lcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljNzI1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL2xpc3RlbmVycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotICAKLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPHRpdGxlPkxpc3RlbmluZyBmb3IgQ2hhbmdlcyB0byBGYWNldGVkIFByb2plY3RzPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idHV0b3JpYWwvdHV0b3JpYWwuY3NzIi8+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAKLSAgLnN1YkhlYWRlcgotICB7Ci0gICAgZm9udC1zaXplOiAxNnB4OwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICB9Ci0gIAotICAuZXZlbnRzVGFibGVIZWFkZXJDZWxsCi0gIHsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzAwMDAwMDsKLSAgICBwYWRkaW5nOiAycHg7Ci0gIH0KLSAgCi0gIC5ldmVudHNUYWJsZVR5cGVDZWxsCi0gIHsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIHBhZGRpbmctdG9wOiAycHg7Ci0gICAgcGFkZGluZy1ib3R0b206IDJweDsKLSAgICBwYWRkaW5nLWxlZnQ6IDJweDsKLSAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4OwotICB9Ci0gIAotICAuZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsCi0gIHsKLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgIHBhZGRpbmctdG9wOiAycHg7Ci0gICAgcGFkZGluZy1ib3R0b206IDJweDsKLSAgICBwYWRkaW5nLWxlZnQ6IDJweDsKLSAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4OwotICB9Ci0gIAotICAuZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwKLSAgewotICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci0gICAgcGFkZGluZzogMnB4OwotICB9Ci0KLTwvc3R5bGU+Ci0KLTxoMSBhbGlnbj0iY2VudGVyIj5MaXN0ZW5pbmcgZm9yIENoYW5nZXMgdG8gRmFjZXRlZCBQcm9qZWN0czwvaDE+Ci0KLTxwPlRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIHByb3ZpZGVzIGEgZmFjaWxpdHkgdGhhdCB3aWxsIG5vdGlmeSBhbnkgaW50ZXJlc3RlZCBwYXJ0aWVzIHdoZW4KLWEgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIG1vZGVsIG9mIGEgZmFjZXRlZCBwcm9qZWN0LiBMaXN0ZW5lcnMgY2FuIGJlIHJlZ2lzdGVyZWQgZWl0aGVyIHZpYSBhIGRpcmVjdAotQVBJIGNhbGwgb3IgdmlhIGFuIGV4dGVuc2lvbiBwb2ludC4gTGlzdGVuZXJzIGNhbiBiZSBnbG9iYWwgb3Igc2NvcGVkIHRvIGEgc3BlY2lmaWMgcHJvamVjdC48L3A+Ci0KLTxwIGNsYXNzPSJzdWJIZWFkZXIiPkV2ZW50czwvcD4KLQotPHRhYmxlIHN0eWxlPSJib3JkZXItY29sbGFwc2U6Y29sbGFwc2UiPgotCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSGVhZGVyQ2VsbCI+RXZlbnQgVHlwZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUhlYWRlckNlbGwiPkV2ZW50IE9iamVjdCBJbnRlcmZhY2U8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVIZWFkZXJDZWxsIj5EZXNjcmlwdGlvbjwvdGQ+Ci0gIDwvdHI+Ci0KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+UFJPSkVDVF9NT0RJRklFRDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklGYWNldGVkUHJvamVjdEV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHdoZW4gZmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGlzIG1vZGlmaWVkIGluIGFueSB3YXkuIE5vIGRldGFpbGVkIGluZm9ybWF0aW9uIAotICAgICAgYWJvdXQgdGhlIGNoYW5nZSBpcyBwcm92aWRlZC4gTm90ZSB0aGF0IHdoaWxlIGxpc3RlbmluZyBmb3IgUFJPSkVDVF9NT0RJRklFRCBldmVudHMgaXMgCi0gICAgICBndWFyYW50ZWVkIHRvIGNhdGNoIGFsbCBvdGhlciBldmVudHMsIHRoZSBpbnZlcnNlIGlzIG5vdCB0cnVlLiBMaXN0aW5nIG9uIGFsbCB0aGUgb3RoZXIgCi0gICAgICBldmVudHMgaXMgbm90IGd1YXJhbnRlZWQgdG8gY2F0Y2ggYWxsIFBST0pFQ1RfTU9ESUZJRUQgZXZlbnRzLiBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgYXJlIAotICAgICAgY2lyY3Vtc3RhbmNlcyB3aGVuIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGUgZGV0YWlscyBhYm91dCB0aGUgdHlwZSBvZiB0aGUgY2hhbmdlIAotICAgICAgKHN1Y2ggYXMgd2hlbiB0aGUgZmFjZXRlZCBwcm9qZWN0IG1ldGFkYXRhIGZpbGUgaXMgbW9kaWZpZWQgb24gZGlzaykuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBSRV9JTlNUQUxMPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHJpZ2h0IGJlZm9yZSBhIGZhY2V0IGlzIGluc3RhbGxlZC4KLSAgICA8L3RkPgotICA8L3RyPgotICAKLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+UE9TVF9JTlNUQUxMPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQ+R2V0cyB0cmlnZ2VyZWQgcmlnaHQgYWZ0ZXIgYSBmYWNldCBpcyBpbnN0YWxsZWQuPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBSRV9VTklOU1RBTEw8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwiPgotICAgICAgR2V0cyB0cmlnZ2VyZWQgcmlnaHQgYmVmb3JlIGEgZmFjZXQgaXMgdW5pbnN0YWxsZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBPU1RfVU5JTlNUQUxMPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SVByb2plY3RGYWNldEFjdGlvbkV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHJpZ2h0IGFmdGVyIGEgZmFjZXQgaXMgdW5pbnN0YWxsZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBSRV9WRVJTSU9OX0NIQU5HRTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZURlc2NyaXB0aW9uQ2VsbCI+Ci0gICAgICBHZXRzIHRyaWdnZXJlZCByaWdodCBiZWZvcmUgYSBmYWNldCB2ZXJzaW9uIGlzIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPlBPU1RfVkVSU0lPTl9DSEFOR0U8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwiPgotICAgICAgR2V0cyB0cmlnZ2VyZWQgcmlnaHQgYWZ0ZXIgYSBmYWNldCB2ZXJzaW9uIGlzIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlVHlwZUNlbGwiPkZJWEVEX0ZBQ0VUU19DSEFOR0VEPC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlSW50ZXJmYWNlQ2VsbCI+SUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHdoZW4gcHJvamVjdCdzIGZpeGVkIGZhY2V0cyBhcmUgY2hhbmdlZC4KLSAgICA8L3RkPgotICA8L3RyPgotICAKLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+VEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJldmVudHNUYWJsZUludGVyZmFjZUNlbGwiPklUYXJnZXRlZFJ1bnRpbWVzQ2hhbmdlZEV2ZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9ImV2ZW50c1RhYmxlRGVzY3JpcHRpb25DZWxsIj4KLSAgICAgIEdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHNldCBvZiBydW50aW1lcyB0aGF0IHRoZSBwcm9qZWN0IHRhcmdldHMgaXMgY2hhbmdlZC4KLSAgICA8L3RkPgotICA8L3RyPgotICAKLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVUeXBlQ2VsbCI+UFJJTUFSWV9SVU5USU1FX0NIQU5HRUQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVJbnRlcmZhY2VDZWxsIj5JUHJpbWFyeVJ1bnRpbWVDaGFuZ2VkRXZlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0iZXZlbnRzVGFibGVEZXNjcmlwdGlvbkNlbGwiPgotICAgICAgR2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgcHJpbWFyeSB0YXJnZXRlZCBydW50aW1lIG9mIHRoZSBwcm9qZWN0IGlzIGNoYW5nZWQuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgICAKLTwvdGFibGU+Ci0KLTxwIGNsYXNzPSJzdWJIZWFkZXIiPlJlZ2lzdGVyaW5nIGEgTGlzdGVuZXI8L3A+Ci0KLTxwPkFsbCBsaXN0ZW5lcnMgaGF2ZSB0byBpbXBsZW1lbnQgPGNvZGU+SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI8L2NvZGU+IGludGVyZmFjZSB3aGljaCBsb29rcyBsaWtlCi10aGlzOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50czsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gaGFuZGxlRXZlbnQoIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICk7Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08cD5EZXBlbmRpbmcgb24gdGhlIGV2ZW50IHR5cGUsIGl0IG1heSBiZSBwb3NzaWJsZSB0byBjYXN0IHRoZSBldmVudCBvYmplY3QgdG8gYSBtb3JlIHNwZWNpZmljCi1pbnRlcmZhY2UgaW4gb3JkZXIgdG8gZ2V0IGRldGFpbHMgYWJvdXQgdGhlIGV2ZW50LiBTZWUgdGhlIGV2ZW50IHRhYmxlIGZvciBpbmZvcm1hdGlvbiBhYm91dCB3aGljaAotZXZlbnQgb2JqZWN0IGludGVyZmFjZSBjb3JyZXNwb25kcyB3aXRoIHdoaWNoIGV2ZW50IHR5cGUuPC9wPgotCi08cD5UaGVyZSBhcmUgdGhyZWUgd2F5cyB0byByZWdpc3RlciBhIGxpc3RlbmVyOjwvcD4KLQotPG9sPgotICA8bGk+SUZhY2V0ZWRQcm9qZWN0LmFkZExpc3RlbmVyKCk8L2xpPgotICA8bGk+RmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoKTwvbGk+Ci0gIDxsaT5FeHRlbnNpb24gUG9pbnQ6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVyczwvcD4KLTwvb2w+Ci0KLTxwPkFsbCBvZiB0aGVzZSBtZXRob2RzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBldmVudHMgdGhlIGxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZCBhYm91dC4gCi1Ob3Qgc3BlY2lmeWluZyBldmVudCB0eXBlcyBvbiByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgYWxsIGV2ZW50cy4gCi1UaGlzIGlzIHR5cGljYWxseSBub3QgZGVzaXJlZC4gSWYgYSBsaXN0ZW5lciBuZWVkcyB0byByZWFjdCB0byBhbnkgY2hhbmdlIGluIHRoZSBwcm9qZWN0IGFuZCBoYXMgbm8gCi1uZWVkIHRvIGFuYWx5emUgc3BlY2lmaWMgZXZlbnRzLCBpdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIDxjb2RlPlBST0pFQ1RfTU9ESUZJRUQ8L2NvZGU+IAotZXZlbnQuPC9wPgotCi08cD5UaGUgZmlyc3QgbWV0aG9kIHJlZ2lzdGVycyBhIGxpc3RlbmVyIHRoYXQgaXMgc2NvcGVkIHRvIGEgc3BlY2lmaWMgcHJvamVjdC4gVGhlIGxhc3QgdHdvCi1yZWdpc3RlciBhIGdsb2JhbCBsaXN0ZW5lciB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IGNoYW5nZXMgaW4gYWxsIGZhY2V0ZWQgcHJvamVjdHMgdGhhdCBhcmUKLXByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZS4gSW4gbW9zdCBjaXJjdW1zdGFuY2VzLCBpZiBhIGdsb2JhbCBsaXN0ZW5lciBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSAKLXJlZ2lzdGVyZWQgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQgcmF0aGVyIHRoYW4gdXNpbmcgPGNvZGU+RmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoKTwvY29kZT4KLUFQSS4gVXNpbmcgdGhlIGV4dGVuc2lvbiBwb2ludCBndWFyYW50ZWVzIHRoYXQgdGhlIGxpc3RlbmVyIHdpbGwgbm90IG1pc3MgYW55IGV2ZW50cyBkdWUgdG8gbm90Ci1iZWluZyByZWdpc3RlcmVkIGVhcmx5IGVub3VnaC4gSXQgYWxzbyBkZWxheXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBsdWdpbiBidW5kbGUgY29udGFpbmluZyB0aGUKLWxpc3RlbmVyIHVudGlsIGFuIGV2ZW50IHRoYXQgdGhlIGxpc3RlbmVyIGlzIGludGVyZXN0ZWQgaW4gaXMgZmlyZWQuPC9wPgotCi08cCBjbGFzcz0ic3ViSGVhZGVyIj5FeHRlbnNpb24gUG9pbnQ8L3A+Ci0KLTxwPlRoZSBleHRlbnNpb24gcG9pbnQgdGhhdCdzIHVzZWQgZm9yIHJlZ2lzdGVyaW5nIGxpc3RlbmVycyBpcyBxdWl0ZSBzaW1wbGUuIE9ubHkgdHdvIHBpY2VzIG9mCi1pbmZvcm1hdGlvbiBuZWVkIHRvIGJlIHN1cHBsaWVkOiB0aGUgbGlzdGVuZXIgY2xhc3MgbmFtZSBhbmQgYW4gb3B0aW9uYWwgbGlzdCBvZiBldmVudCB0eXBlcy48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0ieG1sLWNvZGUiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVyczwvc3Bhbj4iJmd0OwotICAmbHQ7bGlzdGVuZXIgCi0gICAgY2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPntjbGFzczpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXJ9PC9zcGFuPiIKLSAgICBldmVudFR5cGVzPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij57ZXZlbnQudHlwZXN9PC9zcGFuPiIvPiA8aT4oMSBvciBtb3JlKTwvaT4KLSZsdDtleHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5UaGUgPGNvZGU+ZXZlbnRUeXBlczwvY29kZT4gYXR0cmlidXRlIHZhbHVlIHNob3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV2ZW50IHR5cGVzLjwvcD4KLQotPHAgY2xhc3M9InN1YkhlYWRlciI+RXhhbXBsZXM8L3A+Ci0KLTxwPlRoaXMgZXhhbXBsZSByZWdpc3RlcnMgYSB2ZXJ5IHNpbXBsZSBsaXN0ZW5lciB0aGF0IHByaW50cyBvdXQgZXZlbnRzIHJlY2VpdmVkLiBUaGUgbGlzdGVuZXIgaXMKLXJlZ2lzdGVyZWQgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZXhhbXBsZS48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20ubXljb3JwLm15cHJvZHVjdDsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGZpbmFsIGNsYXNzPC9zcGFuPiBMaXN0ZW5lckltcGwgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wbGVtZW50czwvc3Bhbj4gSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IGhhbmRsZUV2ZW50KCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCBldmVudC50b1N0cmluZygpICk7Ci0gICAgfQotfQotPC9wcmU+Ci08L2Rpdj4KLQotPHA+VGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgcmVnaXN0ZXJzIHRoZSBhYm92ZSBsaXN0ZW5lciBvbiBhIHNwZWNpZmljIHByb2plY3QgdG8gbGlzdGVuIGZvcgotY2hhbmdlcyBpbiB0aGUgcnVudGltZXMgdGhhdCB0aGUgcHJvamVjdCB0YXJnZXRzLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLQotLi4uCi0KLUlQcm9qZWN0IHBqOwotCi0uLi4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElGYWNldGVkUHJvamVjdCBmcGogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHBqICk7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+bmV3PC9zcGFuPiBMaXN0ZW5lckltcGwoKTsKLQotZnBqLmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgCi0gICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuVEFSR0VURURfUlVOVElNRVNfQ0hBTkdFRCwKLSAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCApOwotICAgICAgICAgICAgICAgICAKLS4uLgotCi1mcGoucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5UaGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCByZWdpc3RlciB0aGUgYWJvdmUgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciB0aGUgUFJFX0lOU1RBTEwgYW5kCi1QUkVfVU5JTlNUQUxMIGV2ZW50cyBpbiBhbGwgZmFjZXRlZCBwcm9qZWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj48c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci0KLS4uLgotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gTGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+bmV3PC9zcGFuPiBMaXN0ZW5lckltcGwoKTsKLQotRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSRV9JTlNUQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX1VOSU5TVEFMTCApOwotICAgICAgICAgICAgICAgICAKLS4uLgotCi1GYWNldGVkUHJvamVjdEZyYW1ld29yay5yZW1vdmVMaXN0ZW5lciggbGlzdGVuZXIgKTsKLTwvcHJlPgotPC9kaXY+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGFjY29tcGxpc2hlcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgb25lIGFib3ZlLCBleGNlcHQgaXQgZG9lcyB0aGlzCi12aWEgdGhlIGV4dGVuc2lvbiBwb2ludC48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0ieG1sLWNvZGUiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVyczwvc3Bhbj4iJmd0OwotICAmbHQ7bGlzdGVuZXIgY2xhc3M9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmNvbS5teWNvcnAubXlwcm9kdWN0Lkxpc3RlbmVySW1wbDwvc3Bhbj4iIGV2ZW50VHlwZXM9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPlBSRV9JTlNUQUxMLFBSRV9VTklOU1RBTEw8L3NwYW4+Ii8+Ci0mbHQ7ZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPGJyLz48YnIvPjxici8+PGJyLz4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3F1ZXN0aW9ucy5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS9xdWVzdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4YjBkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3F1ZXN0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci0gIAotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICA8dGl0bGU+UXVlc3Rpb25zICZhbXA7IEFuc3dlcnM8L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJ0dXRvcmlhbC90dXRvcmlhbC5jc3MiLz4KLTwvaGVhZD4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMSBhbGlnbj0iY2VudGVyIj5RdWVzdGlvbnMgJmFtcDsgQW5zd2VyczwvaDE+Ci0KLTxwPjxiPjxhIG5hbWU9ImNvbmZpZ3VyZS5mYWNldHMuYnV0dG9uIj5RdWVzdGlvbjogSSdkIGxpa2UgdG8gYmUgYWJsZSB0byBjb25maWd1cmUgbXkgCi1mYWNldCBhZnRlciBpdCBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb2plY3QgRmFjZXRzIHByb3BlcnR5IHBhZ2Ugb3IgdGhlIAotQWRkL1JlbW92ZSBGYWNldHMgd2l6YXJkLiBXaHkgaXNuJ3QgdGhlcmUgYSBjb25maWd1cmUgYnV0dG9uPzwvYj48L3A+Ci0KLTxwPjxiPkFuc3dlcjo8L2I+IFRoZSBQcm9qZWN0IEZhY2V0cyBwcm9wZXJ0eSBwYWdlIGFuZCB0aGUgQWRkL1JlbW92ZSBGYWNldHMgd2l6YXJkCi1hcmUgaW50ZW5kZWQgZm9yIG1hbmFnaW5nIHRoZSBzZXQgb2YgZmFjZXRzIHRoYXQgYXJlIGluc3RhbGxlZCBvbiBhIHByb2plY3QuIAotV2hlbiBjb25maWd1cmF0aW9uIG9mIGFuIGluc3RhbGxlZCBmYWNldCBuZWVkcyB0byBiZSBjaGFuZ2VkLCB0aGUgZXhwZWN0YXRpb24gaXMKLXRoYXQgdGhlIGZhY2V0IGF1dGhvciB3aWxsIHVzZSBleGlzdGluZyBFY2xpcHNlIGZhY2lsaXRpZXMgdG8gcHJvdmlkZSBwcm9qZWN0Ci1wcm9wZXJ0eSBwYWdlcy4gRm9yIGV4YW1wbGUsIHRoZSA8Y29kZT5qc3QuamF2YTwvY29kZT4gZmFjZXQgaXMgY29uZmlndXJlZCB1c2luZyAKLXRoZSA8aT5KYXZhIEJ1aWxkIFBhdGg8L2k+LCA8aT5KYXZhIENvZGUgU3R5bGU8L2k+LCBhbmQgPGk+SmF2YSBDb21waWxlcjwvaT4gCi1wcm9wZXJ0eSBwYWdlcy48L3A+Ci0KLTxici8+PGJyLz48YnIvPgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAxLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4YmZiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODFhZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjFlMjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjAzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlNGI2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzkwM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc2OTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvaW1hZ2VzL3NjcmVlbjA3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzM2UxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wNy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wOC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL2ltYWdlcy9zY3JlZW4wOC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MDQwY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9pbWFnZXMvc2NyZWVuMDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9tYXRlcmlhbHMvc29sdXRpb24uemlwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9tYXRlcmlhbHMvc29sdXRpb24uemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTliN2RjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvbWF0ZXJpYWxzL3NvbHV0aW9uLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvbWF0ZXJpYWxzL3N0YXJ0ZXIuemlwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9tYXRlcmlhbHMvc3RhcnRlci56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjBjYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC9tYXRlcmlhbHMvc3RhcnRlci56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL3R1dG9yaWFsLmNzcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvdHV0b3JpYWwuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzAzNmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvdHV0b3JpYWwvdHV0b3JpYWwuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLXAsIHRhYmxlLCB0ZCwgdGggeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQotcHJlIHsgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9Ci1oMiB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMThwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGxpbmUtaGVpZ2h0OiAxNHB4OyBtYXJnaW4tdG9wOiAzMHB4fQotY29kZSB7ICBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQotc3VwIHsgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2EsZ2VuZXZhOyBmb250LXNpemU6IDEwcHh9Ci1oMyB7ICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkfQotbGkgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQotaDEgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZH0KLWJvZHkgeyAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0OyBjbGlwOiAgIHJlY3QoICAgKTsgbWFyZ2luLXRvcDogNW1tOyBtYXJnaW4tbGVmdDogM21tfQotLmluZGV4dG9wIHsgZm9udC1zaXplOiB4LWxhcmdlOzsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkfQotLmluZGV4c3ViIHsgZm9udC1zaXplOiB4eC1zbWFsbDs7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzgwODBGRn0KLQotcHJlIHsKLSAgICBwYWRkaW5nOiAwcHg7Ci0gICAgbWFyZ2luLXRvcDogMHB4OwotICAgIG1hcmdpbi1sZWZ0OiAwcHg7Ci0gICAgbWFyZ2luLWJvdHRvbTogMHB4OwotICAgIG1hcmdpbi1yaWdodDogMHB4OwotICAgIHRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5jb2RlIHsKLSAJYm9yZGVyOiAxcHggZGFzaGVkICMzYzc4YjU7Ci0gICAgZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5OiBDb3VyaWVyOwotICAgIG1hcmdpbjogMTBweDsKLQlsaW5lLWhlaWdodDogMTNweDsKLSAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Ci0gICAgcGFkZGluZzogMTBweDsKLX0KLQotLmNvZGUteG1sIHsKLSAgY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS5zY2hlbWEtdHlwZQotewotICBjb2xvcjogIzAwOTEwMDsKLSAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKLX0KLQotLnNjaGVtYS10eXBlLWxpbmsgYTpsaW5rCi17Ci0gIGNvbG9yOiAjMDA5MTAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLnNjaGVtYS10eXBlLWxpbmsgYTp2aXNpdGVkCi17Ci0gIGNvbG9yOiAjMDA5MTAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLnNjaGVtYS1jb250cm9sIHsKLSAgY29sb3I6ICMwMDkxMDA7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsKLSAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKLX0KLQotLmNvZGUtdGV4dCB7Ci0gIGNvbG9yOiAjMDA5MTAwOwotICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwotfQotCi0uY29udGV4dC1jb2RlIHsKLSAgY29sb3I6ICM3Njc2NzY7Ci0gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Ci19Ci0KLS54bWwtdGV4dAotewotICBjb2xvcjogIzAwOTEwMDsKLX0KLQotLmphdmEtY29kZSAKLXsKLSAgY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS5qYXZhLWNvbW1lbnQgCi17Ci0gIGNvbG9yOiAjMDA5MTAwOwotfQotCi0uamF2YS1qYXZhZG9jLWtleXdvcmQKLXsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5qYXZhLWtleXdvcmQKLXsKLSAgY29sb3I6ICM3ZjAwNTU7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uamF2YS1saXRlcmFsCi17Ci0gIGNvbG9yOiAjMDA5MTAwOwotfQotCi0uamF2YS1jb250ZXh0Ci17Ci0gIGNvbG9yOiAjNzY3Njc2OwotfQkKLQotLmphdmEtY29udGV4dC1rZXl3b3JkCi17Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQkKLQotLnNjcmVlbi1zaG90IAotewotICAgIG1hcmdpbjogMTBweDsKLX0KLQotLmJsb2NrLWluZGVudCAKLXsKLSAgICBtYXJnaW46IDEwcHg7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL3R1dG9yaWFsLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3R1dG9yaWFsL3R1dG9yaWFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjI1YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS90dXRvcmlhbC90dXRvcmlhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLSAgCi08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gIDx0aXRsZT5FeHRlbmRpbmcgV1RQIFVzaW5nIFByb2plY3QgRmFjZXRzPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idHV0b3JpYWwuY3NzIi8+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDEgYWxpZ249ImNlbnRlciI+RXh0ZW5kaW5nIFdUUCBVc2luZyBQcm9qZWN0IEZhY2V0czwvaDE+Ci0KLTxibG9ja3F1b3RlPgotPGI+U3VtbWFyeTwvYj48YnIvPgotVGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgYWxsb3dzIHRoZSBwbHVnaW4gZGV2ZWxvcGVyIHRvIHRoaW5rIG9mIFdlYiBUb29scyAKLVBsYXRmb3JtIChXVFApIHByb2plY3RzIGFzIGNvbXBvc2VkIG9mIHVuaXRzIG9mIGZ1bmN0aW9uYWxpdHksIG90aGVyd2lzZSBrbm93biAKLWFzIGZhY2V0cywgdGhhdCBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgYnkgdGhlIHVzZXIuIFRoaXMgdHV0b3JpYWwgd2Fsa3MgeW91IAotdGhyb3VnaCBhbiBleGFtcGxlIG9mIGNyZWF0aW5nIGEgY291cGxlIG9mIGJhc2ljIGZhY2V0cyBhbmQgaW4gdGhlIHByb2Nlc3MgCi1jb3ZlcnMgdGhlIG1ham9yaXR5IG9mIHRoZSBmcmFtZXdvcmsncyBleHRlbnNpb24gcG9pbnRzLiBUaGlzIHR1dG9yaWFsIGhhcyBiZWVuCi13cml0dGVuIGZvciB2ZXJzaW9uIDEuNSBvZiB0aGUgV2ViIFRvb2xzIFBsYXRmb3JtLgotPGJyLz48YnIvPgotCi08Yj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYj48YnIvPgotQkVBIFN5c3RlbXMsIEluYy48YnIvPgotU2VwdGVtYmVyIDUsIDIwMDYKLTwvYmxvY2txdW90ZT4KLQotPGhyIHdpZHRoPSIxMDAlIj4KLQotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci0KLTxwPkZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgcHJvdmlkZXMgYSBwb3dlcmZ1bCBtZWNoYW5pc20gZm9yIGV4dGVuZGluZyB0aGUKLWNhcGFiaWxpdGllcyBvZiB0aGUgV2ViIFRvb2xzIFBsYXRmb3JtLiBQcm9qZWN0IGZhY2V0cyBhcmUgdHlwaWNhbGx5IHVzZWQgYXMKLWEgd2F5IG9mIGFkZGluZyBmdW5jdGlvbmFsaXR5IHRvIGEgcHJvamVjdC4gV2hlbiBhIGZhY2V0IGlzIGFkZGVkIHRvIHRoZQotcHJvamVjdCBpdCBjYW4gcGVyZm9ybSBhbnkgbmVjZXNzYXJ5IHNldHVwIGFjdGlvbnMgc3VjaCBhcyBjb3B5aW5nIHJlc291cmNlcywgCi1pbnN0YWxsaW5nIGJ1aWxkZXJzLCBhZGRpbmcgbmF0dXJlcywgZXRjLiBGYWNldHMgY2FuIGFsc28gYmUgdXNlZCBhcyBtYXJrZXJzIGZvcgotZW5hYmxpbmcgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMuPC9wPgotCi08cD5Tb21lIG9mIHRoZSByZWFkZXJzIG1heSBiZSB3b25kZXJpbmcgaG93Ci1mYWNldHMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBwcm9qZWN0IG5hdHVyZXMgd2hpY2ggYXJlIHN1cHBvcnRlZCBieSB0aGUgRWNsaXBzZQotcGxhdGZvcm0uIE5hdHVyZXMgYXJlIGRlc2lnbmVkIHRvIGJlIGhpZGRlbiBmcm9tIHVzZXIncyB2aWV3LiBUaGV5IGFyZQotZXNzZW50aWFsbHkgbWFya2VycyB0aGF0IGFyZSBzZXQgYmVoaW5kIHRoZSBzY2VuZXMgYnkgdG9vbGluZy4gUHJvamVjdCBmYWNldHMsCi1vbiB0aGUgb3RoZXIgaGFuZCwgaGF2ZSBiZWVuIGRlc2lnbmVkIGZyb20gdGhlIGdyb3VuZCB1cCB0byBiZSBtYW5pcHVsYXRlZCBieQotdGhlIGVuZCB1c2Vycy4gVGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgcHJvdmlkZXMgYWxsIHRoZSBuZWNlc3NhcnkgdXNlciAKLWludGVyZmFjZSBlbGVtZW50cyBmb3IgbWFuYWdpbmcgdGhlIGZhY2V0cyBvbiBhIHByb2plY3QgYW5kIHNpbmNlIGZhY2V0cwotYXJlIHNlbGYgZGVzY3JpYmluZyB0aGUgdXNlciBpcyBwcmV2ZW50ZWQgZnJvbSBjcmVhdGluZyBpbnZhbGlkIGNvbmZpZ3VyYXRpb25zLgotQmFzaWNhbGx5LCBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHdyaXRlIGN1c3RvbSBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZHMgb3IKLXRoZSAiRW5hYmxlIEZlYXR1cmUgWCIgbWVudSBhY3Rpb25zLiBDb21tb24gd2F5IG9mIG1hbmFnaW5nIHdoaWNoIGZhY2V0cyBhcmUKLWluc3RhbGxlZCBvbiBhIHByb2plY3QgbWVhbnMgbGVzcyBidXJkZW4gb24gdGhlIHBsdWdpbiB3cml0ZXIgYW5kIGJldHRlciBlbmQgdXNlcgotZXhwZXJpZW5jZS48L3A+Ci0KLTxwPlRoaXMgdHV0b3JpYWwgY292ZXJzIHRoZSBleHRlbnNpb24gcG9pbnRzIGFuZCBKYXZhIEFQSSB0aGF0IGFyZSB1c2VkIGZvciAKLWNyZWF0aW5nIHByb2plY3QgZmFjZXRzLiBUaGUgcmVhZGVyIGlzIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSBmYW1pbGlhciB3aXRoIAotZGV2ZWxvcGluZyBwbHVnaW5zIGZvciBFY2xpcHNlIGFuZCB0byBoYXZlIHVzZXItbGV2ZWwga25vd2xlZGdlIG9mIHRoZSBXZWIgVG9vbHMgCi1QbGF0Zm9ybS48L3A+Ci0KLTxoMj5UdXRvcmlhbCBTY2VuYXJpbzwvaDI+Ci0KLTxwPllvdSBhcmUgYSBkZXZlbG9wZXIgZm9yIGEgY29tcGFueSB3aGljaCBkZXZlbG9wcyBhIHByb2R1Y3QgY2FsbGVkCi1Gb3JtR2VuLiBGb3JtR2VuIGlzIGJhc2ljYWxseSBhIHNlcnZsZXQgdGhhdCBnZW5lcmF0ZXMgSFRNTCBmb3JtcyBiYXNlZCBvbiBYTUwKLWRlZmluaXRpb24gZmlsZXMuIFRoZSBwcm9kdWN0IGlzIGNvbXBvc2VkIG9mIGEgamFyIGNvbnRhaW5pbmcgdGhlIHNlcnZsZXQgYW5kCi1zb21lIGJhc2ljIHdpZGdldHMuIFRoZXJlIGlzIGFsc28gYW4gYWRkLW9uIGphciB3aXRoIHNvbWUgZXh0cmEgd2lkZ2V0cy4gVXNlcnMKLWhhdmUgYmVlbiBtYW51YWxseSBhZGRpbmcgdGhlIGphcnMgaW50byB0aGUgV0VCLUlORi9saWIgZGlyZWN0b3JpZXMgb2YgdGhlaXIKLXdlYiBwcm9qZWN0cyBhbmQgc2V0dGluZyB1cCB0aGUgc2VydmxldCBkZWZpbml0aW9ucyBpbiB3ZWIueG1sIGJ5IGhhbmQuIFlvdXIKLXRhc2sgaXMgdG8gbWFrZSB0aGlzIHNldHVwIGVhc2llciBieSB3cml0aW5nIGEgY291cGxlIG9mIHByb2plY3QgZmFjZXRzIHRoYXQKLXdpbGwgcGVyZm9ybSB0aGVzZSBhY3Rpb25zIGF1dG9tYXRpY2FsbHkuPC9wPgotCi08aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgotCi08ZGl2IGNsYXNzPSJibG9jay1pbmRlbnQiPgotMS4gPGEgaHJlZj0iI2dldHRpbmcuc3RhcnRlZCI+R2V0dGluZyBTdGFydGVkPC9hPjxici8+Ci0yLiA8YSBocmVmPSIjY3JlYXRpbmcuYmFzaWMuZmFjZXRzIj5DcmVhdGluZyBCYXNpYyBGYWNldCBEZWZpbml0aW9uczwvYT48YnIvPgotMy4gPGEgaHJlZj0iI3NwZWNpZnlpbmcuY29uc3RyYWludHMiPlNwZWNpZnlpbmcgQ29uc3RyYWludHM8L2E+PGJyLz4KLTQuIDxhIGhyZWY9IiNpbXBsZW1lbnRpbmcuYWN0aW9ucyI+SW1wbGVtZW50aW5nIEFjdGlvbnM8L2E+PGJyLz4KLTUuIDxhIGhyZWY9IiNjcmVhdGluZy5jYXRlZ29yaWVzIj5DcmVhdGluZyBDYXRlZ29yaWVzPC9hPjxici8+Ci02LiA8YSBocmVmPSIjZGVjb3JhdGluZyI+RGVjb3JhdGluZzwvYT48YnIvPgotNy4gPGEgaHJlZj0iI2FkZGluZy53aXphcmQucGFnZXMiPkFkZGluZyBXaXphcmQgUGFnZXM8L2E+PGJyLz4KLTguIDxhIGhyZWY9IiNkZWZpbmluZy5wcmVzZXRzIj5EZWZpbmluZyBQcmVzZXRzPC9hPjxici8+Ci05LiA8YSBocmVmPSIjcnVudGltZS5tYXBwaW5ncyI+U3BlY2lmeWluZyBSdW50aW1lIFN1cHBvcnQgTWFwcGluZ3M8L2E+PGJyLz4KLTEwLiA8YSBocmVmPSIjc3VtbWFyeSI+U3VtbWFyeTwvYT48YnIvPgotQXBwZW5kaXggQTogPGEgaHJlZj0iI2N1c3RvbS52ZXJzaW9uLmNvbXBhcmF0b3JzIj5DdXN0b20gVmVyc2lvbiBDb21wYXJhdG9yczwvYT48YnIvPgotQXBwZW5kaXggQjogPGEgaHJlZj0iI3ZlcnNpb24uZXhwcmVzc2lvbnMiPlZlcnNpb24gRXhwcmVzc2lvbnM8L2E+PGJyLz4KLUFwcGVuZGl4IEM6IDxhIGhyZWY9IiNwcm9wZXJ0eS50ZXN0ZXIiPlByb3BlcnR5IFRlc3RlcjwvYT48YnIvPgotQXBwZW5kaXggRDogPGEgaHJlZj0iI3dpemFyZC5jb250ZXh0Ij5XaXphcmQgQ29udGV4dDwvYT48YnIvPgotPC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJnZXR0aW5nLnN0YXJ0ZWQiPjEuIEdldHRpbmcgU3RhcnRlZDwvYT48L2gyPgotCi08cD5UbyBmb2xsb3cgYWxvbmcgd2l0aCB0aGlzIHR1dG9yaWFsLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgYSB3b3JraW5nIGluc3RhbGwgCi1vZiBXZWIgVG9vbHMgUGxhdGZvcm0gdjEuNS4gVGhlIHR1dG9yaWFsIGlzIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggMS4wLngKLXZlcnNpb24gb2YgV1RQIGFzIHRoZXJlIGFyZSBudW1lcm91cyBleHRlbnNpb24gcG9pbnQgYW5kIEFQSSBkaWZmZXJlbmNlcy4gWW91IAotY2FuIGRvd25sb2FkIHRoZSBpbnN0YWxsIGtpdHMgZm9yIFdUUCBhbmQgaXRzIHByZXJlcXVpc2l0ZXMsIGluY2x1ZGluZyBFY2xpcHNlIAotUGxhdGZvcm0gdjMuMiwgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9kb3dubG9hZHMvIj5FY2xpcHNlIFBsYXRmb3JtIERvd25sb2FkIFNpdGU8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy9kb3dubG9hZHMvIj5XZWIgVG9vbHMgUGxhdGZvcm0gRG93bmxvYWQgU2l0ZTwvYT48L2xpPgotPC91bD4KLQotPHA+T25jZSB0aGUgcmVxdWlyZWQgc29mdHdhcmUgaGFzIGJlZW4gaW5zdGFsbGVkIHlvdSB3aWxsIG5lZWQgdG8KLWNyZWF0ZSBhIG5ldyB3b3Jrc3BhY2UgYW5kIGFkZCB0aGUgPGEgaHJlZj0ibWF0ZXJpYWxzL3N0YXJ0ZXIuemlwIj5zdGFydGVyIHByb2plY3Q8L2E+Ci10byBpdC4gVGhlIHN0YXJ0ZXIgcHJvamVjdCBpbmNsdWRlcyB0aGUgbWF0ZXJpYWxzIGFuZCB1dGlsaXR5IGNvZGUgdGhhdCB3aWxsCi1iZSB1c2VkIGluIHRoaXMgdHV0b3JpYWwuIElmIHlvdSBnZXQgc3R1Y2sgYXQgYW55IHBvaW50IHlvdSBjYW4gdGFrZSBhIHBlZWsgYXQKLXRoZSA8YSBocmVmPSJtYXRlcmlhbHMvc29sdXRpb24uemlwIj5zb2x1dGlvbiBwcm9qZWN0PC9hPi48L3A+Ci0KLTxoMj48YSBuYW1lPSJjcmVhdGluZy5iYXNpYy5mYWNldHMiPjIuIENyZWF0aW5nIEJhc2ljIEZhY2V0IERlZmluaXRpb25zPC9hPjwvaDI+Ci0KLTxwPlByb2plY3QgZmFjZXRzIGFyZSBkZWNsYXJlZCB2aWEgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0czwvY29kZT4KLWV4dGVuc2lvbiBwb2ludC4gVGhpcyBpcyBhIHByZXR0eSBsYXJnZSBleHRlbnNpb24gcG9pbnQgd2l0aCBsb3RzIG9mIGZhY2lsaXRpZXMsCi1idXQgd2Ugd2lsbCBzdGFydCBzbWFsbCBhbmQgcHJvZ3Jlc3MgaW5jcmVtZW50YWxseSB3aGlsZSBidWlsZGluZyB0aGUgdHV0b3JpYWwKLWZhY2V0cy4gSGVyZSBpcyB0aGUgcGFydCBvZiB0aGUgc2NoZW1hIHRoYXQgd2Ugd2lsbCBiZSB3b3JraW5nIHdpdGggaW5pdGlhbGx5OjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldCBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4ob3B0aW9uYWwpPC9zcGFuPgotICAmbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDAgb3IgbW9yZSk8L3NwYW4+Ci0gIAotJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+Ci08L2Rpdj4KLQotPHA+QXMgeW91IGNhbiBzZWUsIHRoZXJlIGFyZSB0d28gdG9wLWxldmVsIGVsZW1lbnRzIGluIHRoaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9uCi1wb2ludCBzY2hlbWEuIFRoZSA8Y29kZT4mbHQ7cHJvamVjdC1mYWNldCZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZCB0byBkZWNsYXJlCi10aGUgZmFjZXQgaXRzZWxmLiBUaGUgPGNvZGU+Jmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZAotdG8gZGVjbGFyZSB2ZXJzaW9ucyBvZiB0aGUgZmFjZXQuIEV2ZXJ5IGZhY2V0IGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIHByb3ZpZGUKLWF0IGxlYXN0IG9uZSBmYWNldCB2ZXJzaW9uIGRlY2xhcmF0aW9uLiBJbiBmYWN0LCBhcyB5b3Ugd2lsbCBzZWUgbGF0ZXIgaW4gdGhpcwotdHV0b3JpYWwsIHRoZSBidWxrIG9mIHRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIDxjb2RlPiZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7PC9jb2RlPgotZGVjbGFyYXRpb24uIEZvciBub3cgYWxsIHlvdSBuZWVkIHRvIHJlbWVtYmVyIGlzIHRoYXQgYSBmYWNldCBjYW5ub3QgYmUgdXNlZAotdW5sZXNzIGl0IGhhcyBhdCBsZWFzdCBvbmUgdmVyc2lvbi48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0czwvc3Bhbj4iJmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0IGlkPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+IiZndDsKLSAgICAmbHQ7bGFiZWwmZ3Q7PHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+Rm9ybUdlbiBDb3JlPC9zcGFuPiZsdDsvbGFiZWwmZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgPHNwYW4gY2xhc3M9ImNvZGUtdGV4dCI+RW5hYmxlcyBnZW5lcmF0aW9uIG9mIEhUTUwgZm9ybXMgYmFzZWQgb24gWE1MIGRlZmluaXRpb24gZmlsZXMuPC9zcGFuPgotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICZsdDsvcHJvamVjdC1mYWNldCZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij4xLjA8L3NwYW4+Ii8mZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPmZvcm1nZW4uZXh0PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkZvcm1HZW4gRXh0ZW5zaW9uczwvc3Bhbj4mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAgICAgIDxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPkVuYWJsZXMgYWRkaXRpb25hbCBGb3JtR2VuIHdpZGdldHMuPC9zcGFuPgotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICZsdDsvcHJvamVjdC1mYWNldCZndDsKLQotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSI8c3BhbiBjbGFzcz0iY29kZS10ZXh0Ij5mb3JtZ2VuLmV4dDwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJjb2RlLXRleHQiPjEuMDwvc3Bhbj4iLyZndDsKLSAgCi0mbHQ7L2V4dGVuc2lvbiZndDs8L3ByZT4KLTwvZGl2PgotCi08cD5JbnNlcnQgdGhlIGFib3ZlIGNvZGUgaW50byB5b3VyIHBsdWdpbi54bWwgZmlsZSBhbmQgbGV0cyBzZWUgaXQgaW4gYWN0aW9uLgotTGF1bmNoIEVjbGlwc2Ugd2l0aCB5b3VyIEZvcm1HZW4gcGx1Z2luIGFuZCB0aGVuIG9wZW4gdGhlIER5bmFtaWMgV2ViIFByb2plY3QKLXdpemFyZC4gTWFrZSBzdXJlIHRoYXQgPGNvZGU+Jmx0O25vbmUmZ3Q7PC9jb2RlPiBpcyBzZWxlY3RlZCBpbiB0aGUgVGFyZ2V0IFJ1bnRpbWUKLWZpZWxkIG9uIHRoZSBmaXJzdCBwYWdlIGFuZCBnbyB0byB0aGUgc2Vjb25kIHBhZ2UuIFlvdSBzaG91bGQgc2VlIGEgc2NyZWVuIHRoYXQKLWxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZy4gTm90ZSB0aGF0IHRoZSBGb3JtR2VuIGZhY2V0cyB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQKLWFyZSBkaXNwbGF5ZWQuPC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wMS5naWYiLz48L2Rpdj4KLQotPGgyPjxhIG5hbWU9InNwZWNpZnlpbmcuY29uc3RyYWludHMiPjMuIFNwZWNpZnlpbmcgQ29uc3RyYWludHM8L2E+PC9oMj4KLQotPHA+T25lIG9mIHRoZSBwcm9ibGVtcyB3aXRoIHdoYXQgd2UgaGF2ZSBzbyBmYXIgaXMgdGhhdCB0aGUgRm9ybUdlbiBmYWNldHMKLWFwcGVhciBpbiBvdGhlciBtb2R1bGUgcHJvamVjdCB3aXphcmRzIHN1Y2ggYXMgdGhlIEVKQiBQcm9qZWN0IFdpemFyZC4gVGhhdCwgb2YKLWNvdXJzZSwgbWFrZXMgbm8gc2Vuc2Ugc2luY2UgRm9ybUdlbiBpcyBzZXJ2bGV0LWJhc2VkIHRlY2hub2xvZ3kgYW5kIHNvIGlzIG9ubHkKLWFwcGxpY2FibGUgdG8gSjJFRSB3ZWIgYXBwbGljYXRpb25zLiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0gd2Ugd2lsbCB1c2UgdGhlIAotY29uc3RyYWludCBtZWNoYW5pc20gdG8gc3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzLjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoYXQgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBsb29rcyBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+PHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L3NwYW4+Ci0gICAgJmx0O2NvbnN0cmFpbnQmZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KG9wdGlvbmFsKTwvc3Bhbj4KLSAgICAgIDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+W2V4cHJdPC9zcGFuPgotICAgICZsdDsvY29uc3RyYWludCZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+Ci0KLTxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+W2V4cHJdID08L3NwYW4+Ci0gICZsdDtyZXF1aXJlcyBmYWNldD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlLWxpbmsiPns8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbi5leHByPC9hPn08L3NwYW4+PC9zcGFuPiIgc29mdD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Ym9vbGVhbn08L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+b3I8L3NwYW4+Ci0gICZsdDtjb25mbGljdHMgZmFjZXQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZS1saW5rIj57PGEgaHJlZj0iI3ZlcnNpb24uZXhwcmVzc2lvbnMiPnZlcnNpb24uZXhwcjwvYT59PC9zcGFuPjwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj5vcjwvc3Bhbj4KLSAgJmx0O2NvbmZsaWN0cyBncm91cD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj5vcjwvc3Bhbj4KLSAgJmx0O2FuZCZndDsKLSAgICA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPltleHByXTwvc3Bhbj4gPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMSBvciBtb3JlKTwvc3Bhbj4KLSAgJmx0Oy9hbmQmZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+b3I8L3NwYW4+Ci0gICZsdDtvciZndDsKLSAgICA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPltleHByXTwvc3Bhbj4gPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMSBvciBtb3JlKTwvc3Bhbj4KLSAgJmx0Oy9vciZndDs8L3ByZT4KLTwvZGl2PgotCi08cD5BcyB5b3UgY2FuIHNlZSwgdGhlIGNvbnN0cmFpbnQgaXMgYW4gZXhwcmVzc2lvbiB0cmVlIGFuZCB5b3UgaGF2ZSBmb3VyCi1vcGVyYXRvcnMgYXQgeW91ciBkaXNwb3NhbC4gTGV0cyBnbyBvdmVyIHRoZW0gb25lIGJ5IG9uZS48L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4Ij4KLTxwPjxiPnJlcXVpcmVzPC9iPjwvcD4KLQotPHA+VGhlIDxjb2RlPnJlcXVpcmVzPC9jb2RlPiBvcGVyYXRvciBpcyB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgb2YgYWxsIHRoZSBvcGVyYXRvcnMuIAotSXQgaXMgdXNlZCB0byBzcGVjaWZ5IGEgZGVwZW5kZW5jeSBvbiBhbm90aGVyIGZhY2V0LiBJZiB0aGUgPGNvZGU+dmVyc2lvbjwvY29kZT4KLWF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCBhbnkgdmVyc2lvbiBvZiB0aGUgcmVmZXJlbmNlZCBmYWNldCB3aWxsIHNhdGlzZnkKLXRoZSBjb25zdHJhaW50LiBJZiBvbmx5IHNwZWNpZmljIHZlcnNpb25zIHdpbGwgZG8sIHRoZSA8Y29kZT52ZXJzaW9uPC9jb2RlPiAKLWF0dHJpYnV0ZSBjYW4gY29udGFpbiBhIDxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uIGV4cHJlc3Npb248L2E+LjwvcD4KLQotPHA+VGhlIDxjb2RlPnNvZnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwga2luZCBvZiBhCi1kZXBlbmRlbmN5LiBGYWNldCBzZWxlY3Rpb24gd2lsbCBub3QgYmUgcHJldmVudGVkIGlmIHRoZSBkZXBlbmRlbmN5IGlzIG5vdAotbWV0LCBidXQgaWYgdGhlIGRlcGVuZGVuY3kgaXMgbWV0LCB0aGUgZmFjZXQgaXMgZ3VhcmFudGVlZCB0byBiZSBpbnN0YWxsZWQKLWFmdGVyIHRoZSByZWZlcmVuY2VkIGZhY2V0LjwvcD4KLQotPHA+PGI+Y29uZmxpY3RzPC9iPjwvcD4KLQotPHA+VGhlIDxjb2RlPmNvbmZsaWN0czwvY29kZT4gY29uc3RyYWludCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGRlY2xhcmluZwotZmFjZXQgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgaWYgaW5zdGFsbGVkIGludG8gdGhlIHNhbWUgcHJvamVjdCBhcyByZWZlcmVuY2VkCi1mYWNldHMuIFRoZSA8Y29kZT5jb25mbGljdHM8L2NvZGU+IGNvbnN0cmFpbnQgY29tZXMgaW4gdHdvIGZsYXZvcnMuIFlvdSBjYW4KLWVpdGhlciBzcGVjaWZ5IGEgY29uZmxpY3Qgd2l0aCBhIHNpbmdsZSBmYWNldCBvciB3aXRoIGEgZ3JvdXAgb2YgZmFjZXRzLjwvcD4KLQotPHA+V2hhdCBhcmUgZ3JvdXBzIG9mIGZhY2V0cz8gRmFjZXQgZ3JvdXBzIGFyZSBhIHdheSB0byBkZXNpZ25hdGUgYSBjb25mbGljdCB3aXRoCi1hIGNlcnRhaW4gY2xhc3Mgb2YgZmFjZXRzIHdpdGhvdXQgaGF2aW5nIHRvIGxpc3QgYWxsIG9mIHRoZSBmYWNldHMgZXhwbGljaXRseS4KLUZvciBpbnN0YW5jZSwgdGhlIFdUUCBtb2R1bGUgZmFjZXRzIGFsbCBiZWxvbmcgdG8gdGhlICJtb2R1bGVzIiBncm91cC4gVGhleSBhbHNvCi1lYWNoIGRlY2xhcmUgYSBjb25mbGljdCB3aXRoIHRoZSAibW9kdWxlcyIgZ3JvdXAuIFRoaXMgcHJldmVudHMgdHdvIG1vZHVsZSBmYWNldHMKLWZyb20gYmVpbmcgaW5zdGFsbGVkIGludG8gdGhlIHNhbWUgcHJvamVjdC4gQnkgZGVjbGFyaW5nIGEgY29uZmxpY3Qgd2l0aCBhCi1ncm91cCB3aG9zZSBtZW1iZXJzaGlwIGNhbiBleHBhbmQgYXMgbmVjZXNzYXJ5LCB0aGlyZCBwYXJ0aWVzIGNhbiBhZGQgbW9kdWxlCi1mYWNldHMgb24gdG9wIG9mIFdUUCBhbmQgaGF2ZSB0aGUgbmV3IGZhY2V0cyBpbnRlcmFjdCBjb3JyZWN0bHkgd2l0aCB0aGUKLWJ1aWx0LWluIG1vZHVsZSBmYWNldHMuPC9wPgotCi08cD5BIGZhY2V0IGdyb3VwIGlzIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYSBmYWNldCBkZWNsYXJlcyBncm91cCBtZW1iZXJzaGlwLgotSGVyZSBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBmb3IgZGVjbGFyaW5nIGdyb3VwIG1lbWJlcnNoaXA6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7Z3JvdXAtbWVtYmVyIGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPjxiPmFuZCAmYW1wOyBvcjwvYj4KLQotPHA+VGhlIDxjb2RlPmFuZDwvY29kZT4gJmFtcDsgPGNvZGU+b3I8L2NvZGU+IGNvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIHBlcmZvcm0gCi1sb2dpY2FsIGNvbmp1bmN0aW9uIGFuZCBkaXNqdW5jdGlvbiBvdmVyIHRoZWlyIG9wZXJhbmRzLiBBbHRob3VnaCBpdCBpcyBsZWdhbAotZm9yIHRoZXNlIG9wZXJhdG9ycyB0byBoYXZlIG9ubHkgb25lIG9wZXJhbmQsIHR5cGljYWxseSB0aGV5IHdpbGwgaGF2ZSB0d28gb3IKLW1vcmUuPC9wPgotPC9kaXY+Ci0KLTxwPldlIGNhbiBub3cgc3BlY2lmeSB0aGUgY29uc3RyYWludHMgZm9yIHRoZSBGb3JtR2VuIGZhY2V0cy4gVGhlIGZhY2V0IGlkIHRoYXQKLW1hcmtzIGEgcHJvamVjdCBhcyBhIEoyRUUgd2ViIG1vZHVsZSBpcyA8Y29kZT5qc3Qud2ViPC9jb2RlPi4gV2Ugd2lsbCBzZXR1cAotYSBkZXBlbmRlbmN5IG9uIGl0IGZyb20gdGhlIDxjb2RlPmZvcm1nZW4uY29yZTwvY29kZT4gZmFjZXQuIFRoZQotPGNvZGU+Zm9ybWdlbi5leHQ8L2NvZGU+IGZhY2V0IGNhbiB0aGVuIGRlcGVuZCBvbiB0aGUgPGNvZGU+Zm9ybWdlbi5leHQ8L2NvZGU+Ci1mYWNldC4gVGhhdCBsYXR0ZXIgY29uc3RyYWludCB3aWxsIGVuc3VyZSB0aGF0IHRoZSBGb3JtR2VuIEV4dGVuc2lvbnMKLWFyZSBub3QgaW5zdGFsbGVkIHdpdGhvdXQgaW5zdGFsbGluZyBGb3JtR2VuIENvcmUuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotCi0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24gaWQ9ImZvcm1nZW4uY29yZSIgdmVyc2lvbj0iMS4wIiZndDs8L3NwYW4+Ci0gICAgJmx0O2NvbnN0cmFpbnQmZ3Q7Ci0gICAgICAmbHQ7cmVxdWlyZXMgZmFjZXQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+anN0LndlYjwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Mi4yLDIuMywyLjQ8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0Oy9jb25zdHJhaW50Jmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0KLSAgJmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBpZD0iZm9ybWdlbi5leHQiIHZlcnNpb249IjEuMCImZ3Q7PC9zcGFuPgotICAgICZsdDtjb25zdHJhaW50Jmd0OwotICAgICAgJmx0O3JlcXVpcmVzIGZhY2V0PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZTwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+MS4wPC9zcGFuPiIvJmd0OwotICAgICZsdDsvY29uc3RyYWludCZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotICAKLSZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj48L3ByZT4KLTwvZGl2PgotCi08cD5PbmNlIHRoZSBhYm92ZSBjb2RlIGlzIGFkZGVkLCB0aGUgRm9ybUdlbiBmYWNldHMgc2hvdWxkIG9ubHkgYXBwZWFyIGluIHRoZQotRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQuPC9wPgotCi08aDI+PGEgbmFtZT0iaW1wbGVtZW50aW5nLmFjdGlvbnMiPjQuIEltcGxlbWVudGluZyBBY3Rpb25zPC9hPjwvaDI+Ci0KLTxwPkxldCdzIG5vdyB0cnkgc2VsZWN0aW5nIHRoZSBGb3JtR2VuIENvcmUgZmFjZXQgb24gdGhlIGZhY2V0cyBzZWxlY3Rpb24gcGFnZQotb2YgdGhlIER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLiBJZiB5b3UgZG8gdGhhdCwgeW91IHNob3VsZCBzZWUgdGhlCi1mb2xsb3dpbmcgZXJyb3IgbWVzc2FnZSBhcHBlYXIuPC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wMi5naWYiLz48L2Rpdj4KLQotPHA+VGhpcyBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCBiZWNhdXNlIHRoZSBpbnN0YWxsIGFjdGlvbiBoYXMgbm90IGJlZW4KLWltcGxlbWVudGVkIGZvciB0aGlzIGZhY2V0LiBXaGF0J3MgYW4gYWN0aW9uPyBBbiBhY3Rpb24gaXMgYW4gb3BlcmF0aW9uIHRoYXQgYQotdXNlciBjYW4gcGVyZm9ybSBvbiBhIGZhY2V0LiBUaGVyZSBhcmUgdGhyZWUgYWN0aW9uIHR5cGVzIDxjb2RlPklOU1RBTEw8L2NvZGU+LAotPGNvZGU+VU5JTlNUQUxMPC9jb2RlPiwgYW5kIDxjb2RlPlZFUlNJT05fQ0hBTkdFPC9jb2RlPi4gV2Ugd2lsbCBub3cgaW1wbGVtZW50Ci10aGUgaW5zdGFsbCBhY3Rpb25zIGZvciB0aGUgRm9ybUdlbiBmYWNldHMuPC9wPgotCi08cD5IZXJlIGlzIHdoYXQgdGhhdCBwYXJ0IG9mIHRoZSBleHRlbnNpb24gcG9pbnQgc2NoZW1hIGxvb2tzIGxpa2U6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0Ozwvc3Bhbj4KLSAgJmx0O2FjdGlvbiBpZD0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iIGZhY2V0PSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj48c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUtbGluayI+ezxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uLmV4cHI8L2E+fTwvc3Bhbj48L3NwYW4+IiB0eXBlPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPklOU1RBTEx8VU5JTlNUQUxMfFZFUlNJT05fQ0hBTkdFPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2RlbGVnYXRlIGNsYXNzPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntjbGFzczpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGV9PC9zcGFuPiIvJmd0OwotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgdmFsdWU9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDAgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvYWN0aW9uJmd0OwotPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPHVsPgotCi0gIDxsaT48cD5UaGUgdmVyc2lvbiBhdHRyaWJ1dGUgY2FuIGNvbnRhaW4gYSBzaW5nbGUgdmVyc2lvbiBvciBhIDxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uIGV4cHJlc3Npb248L2E+LgotICAgIEl0IGNhbiBhbHNvIGJlIG9taXR0ZWQgaWYgdGhlIGFjdGlvbiBhcHBsaWVzIHRvIGFsbCB2ZXJzaW9ucyBvZiB0aGUgZmFjZXQuPC9wPjwvbGk+Ci0gICAgCi0gIDxsaT48cD5UaGUgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGZyYW1ld29yawotICAgIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBvbmUgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOjwvcD4KLSAgICA8cD48Y29kZT5bZmFjZXQtaWRdI1t2ZXJzaW9uLWV4cHJlc3Npb25dI1thY3Rpb24tdHlwZV0oI1twcm9wLW5hbWVdPVtwcm9wLXZhbHVlXSkqPC9jb2RlPjwvcD4KLSAgICA8cD5BcyB5b3UgY2FuIHNlZSwgaXQgaXMgYmV0dGVyIHRvIHByb3ZpZGUgYW4gZXhwbGljaXQgaWQgcmF0aGVyIHRoYW4gbGV0dGluZwotICAgIHRoZSBmcmFtZXdvcmsgZ2VuZXJhdGUgaXQuIExhdGVyIGluIHRoZSB0dXRvcmlhbCB3ZSB3aWxsIGNvdmVyIGV4dGVuc2lvbgotICAgIHBvaW50cyB0aGF0IG1ha2UgcmVmZXJlbmNlcyB0byBhY3Rpb24gaWRzLjwvcD4KLSAgCi0gIDxsaT48cD5UaGUgPGNvZGU+Jmx0O2FjdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgY2FuIGFsc28gYmUgZW1iZWRlZCBpbnNpZGUgdGhlCi0gICAgPGNvZGU+Jmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L2NvZGU+IGVsZW1lbnQuIEluIHRoYXQgY2FzZSwgdGhlCi0gICAgPGNvZGU+ZmFjZXQ8L2NvZGU+IGFuZCA8Y29kZT52ZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBvbWl0dGVkLgotICAgIE5vdGUgdGhhdCBpZiB0aGUgc2FtZSBkZWxlZ2F0ZSBpbXBsZW1lbnRhdGlvbiBhcHBsaWVzIHRvIG11bHRpcGxlIGZhY2V0IAotICAgIHZlcnNpb25zLCBpdCBpcyBiZXR0ZXIgdG8gcHJvdmlkZSBhIHNpbmdsZSBhY3Rpb24gZGVjbGFyYXRpb24gZXh0ZXJuYWxseS4KLSAgICBUaGlzIGFsbG93cyB0aGUgZnJhbWV3b3JrIHRvIHBlcmZvcm0gY2VydGFpbiBraW5kcyBvZiBvcHRpbWl6YXRpb25zPC9wPjwvbGk+Ci0gICAgCi0gIDxsaT48cD5Gb3IgdGhlIDxjb2RlPlZFUlNJT05fQ0hBTkdFPC9jb2RlPiBhY3Rpb24sIGl0IGlzIHBvc3NpYmxlIHRvIHJlc3RyaWN0Ci0gICAgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhlIGFjdGlvbiBkZWZpbml0aW9uIHdpdGggcmVnYXJkcyB0byB0aGUgc3RhcnRpbmcKLSAgICB2ZXJzaW9uLiBUbyBkbyB0aGF0LCBzaW1wbHkgc3BlY2lmeSAiZnJvbS52ZXJzaW9ucyIgcHJvcGVydHkgaW4gdGhlIGFjdGlvbgotICAgIGRlZmluaXRpb24uIFRoZSB2YWx1ZSBpcyBhIDxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uIGV4cHJlc3Npb248L2E+LgotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZyYW1ld29yayB3aWxsIGFzc3VtZSB0aGF0IHRoZSBkZWxlZ2F0ZQotICAgIGlzIGNhcGFibGUgb2YgY29udmVydGluZyBmcm9tIGFueSBzdGFydGluZyB2ZXJzaW9uLjwvcD48L2xpPgotICAgIAotPC91bD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBsb2dpYyBhc3NvY2lhdGVkIHdpdGgKLSAqIGEgcGFydGljdWxhciBldmVudCBpbiBwcm9qZWN0IGZhY2V0J3MgbGlmZSBjeWNsZSwgc3VjaCBhcyBpbnN0YWxsIG9yIAotICogdW5pbnN0YWxsLgotICovPC9zcGFuPgotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgaW50ZXJmYWNlPC9zcGFuPiBJRGVsZWdhdGUgCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogVGhlIG1ldGhvZCB0aGF0J3MgY2FsbGVkIHRvIGV4ZWN1dGUgdGhlIGRlbGVnYXRlLgotICAgICAqIAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBwcm9qZWN0IHRoZSB3b3Jrc3BhY2UgcHJvamVjdAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBmdiB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIHRoYXQgdGhpcyBkZWxlZ2F0ZSBpcyBoYW5kbGluZzsgdGhpcwotICAgICAqICAgaXMgdXNlZnVsIHdoZW4gc2hhcmluZyB0aGUgZGVsZWdhdGUgYW1vbmcgc2V2ZXJhbCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotICAgICAqICAgcHJvamVjdCBmYWNldCBvciBldmVuIGRpZmZlcmVudCBwcm9qZWN0IGZhY2V0cwotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBkZWZhdWx0cwotICAgICAqICAgc2hvdWxkIGJlIHVzZWQKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkBwYXJhbTwvc3Bhbj4gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHRocm93czwvc3Bhbj4gQ29yZUV4Y2VwdGlvbiBpZiB0aGUgZGVsZWdhdGUgZmFpbHMgZm9yIGFueSByZWFzb24KLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gZXhlY3V0ZSggSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgCi0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRocm93czwvc3Bhbj4gQ29yZUV4Y2VwdGlvbjsKLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPkxldCdzIG5vdyBkaXZlIGluIGFuZCBpbXBsZW1lbnQgdGhlIGluc3RhbGwgZGVsZWdhdGVzIGZvciB0aGUgRm9ybUdlbiBmYWNldHMuCi1UaGUgPGNvZGU+Zm9ybWdlbi5jb3JlPC9jb2RlPiBmYWNldCBzaG91bGQgKGEpIGNvcHkgPGNvZGU+Zm9ybWdlbi1jb3JlLmphcjwvY29kZT4KLWludG8gdGhlIHByb2plY3QncyA8Y29kZT5XRUItSU5GL2xpYjwvY29kZT4gZGlyZWN0b3J5LCBhbmQgKGIpIHJlZ2lzdGVyIHRoZQotRm9ybUdlbiBzZXJ2bGV0IGluIDxjb2RlPndlYi54bWw8L2NvZGU+LiBUaGUgPGNvZGU+Zm9ybWdlbi5leHQ8L2NvZGU+IGZhY2V0IHNob3VsZAotY29weSB0aGUgPGNvZGU+Zm9ybWdlbi1leHQuamFyPC9jb2RlPiBpbnRvIHRoZSBwcm9qZWN0J3MgPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+Ci1kaXJlY3RvcnkuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0Ozwvc3Bhbj4KLQotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmb3JtZ2VuLmNvcmUiIHZlcnNpb249IjEuMCImZ3Q7PC9zcGFuPgotICAgICZsdDthY3Rpb24gdHlwZT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5JTlNUQUxMPC9zcGFuPiImZ3Q7Ci0gICAgICAmbHQ7ZGVsZWdhdGUgY2xhc3M9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuQ29yZUZhY2V0SW5zdGFsbERlbGVnYXRlPC9zcGFuPiIvJmd0OwotICAgICZsdDsvYWN0aW9uJmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDs8L3NwYW4+Ci0KLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0O3Byb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZm9ybWdlbi5leHQiIHZlcnNpb249IjEuMCImZ3Q7PC9zcGFuPgotICAgICZsdDthY3Rpb24gdHlwZT0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5JTlNUQUxMPC9zcGFuPiImZ3Q7Ci0gICAgICAmbHQ7ZGVsZWdhdGUgY2xhc3M9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuRXh0RmFjZXRJbnN0YWxsRGVsZWdhdGU8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0Oy9hY3Rpb24mZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldC12ZXJzaW9uJmd0Ozwvc3Bhbj4KLSAgCi08c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+Ci08L3ByZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+PHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cGFja2FnZTwvc3Bhbj4gY29tLmZvcm1nZW4uZWNsaXBzZTsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGZpbmFsIGNsYXNzPC9zcGFuPiBGb3JtR2VuQ29yZUZhY2V0SW5zdGFsbERlbGVnYXRlIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcGxlbWVudHM8L3NwYW4+IElEZWxlZ2F0ZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyB2b2lkPC9zcGFuPiBleGVjdXRlKCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2plY3QgcGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCi0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRocm93czwvc3Bhbj4gQ29yZUV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDIgKTsKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50cnk8L3NwYW4+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJRm9sZGVyIHdlYkluZkxpYiA9IFV0aWxzLmdldFdlYkluZkxpYkRpciggcGogKTsKLQotICAgICAgICAgICAgVXRpbHMuY29weUZyb21QbHVnaW4oIG5ldyBQYXRoKCAibGlicy9mb3JtZ2VuLWNvcmUuamFyIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYkluZkxpYi5nZXRGaWxlKCAiZm9ybWdlbi1jb3JlLmphciIgKSApOwotCi0gICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotCi0gICAgICAgICAgICBVdGlscy5yZWdpc3RlckZvcm1HZW5TZXJ2bGV0KCBwaiApOwotCi0gICAgICAgICAgICBtb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICB9Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsbHk8L3NwYW4+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IGNvbS5mb3JtZ2VuLmVjbGlwc2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRm9ybUdlbkV4dEZhY2V0SW5zdGFsbERlbGVnYXRlIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcGxlbWVudHM8L3NwYW4+IElEZWxlZ2F0ZQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyB2b2lkPC9zcGFuPiBleGVjdXRlKCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2plY3QgcGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBPYmplY3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCi0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRocm93czwvc3Bhbj4gQ29yZUV4Y2VwdGlvbgotCi0gICAgewotICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50cnk8L3NwYW4+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJRm9sZGVyIHdlYkluZkxpYiA9IFV0aWxzLmdldFdlYkluZkxpYkRpciggcGogKTsKLQotICAgICAgICAgICAgVXRpbHMuY29weUZyb21QbHVnaW4oIG5ldyBQYXRoKCAibGlicy9mb3JtZ2VuLWV4dC5qYXIiICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViSW5mTGliLmdldEZpbGUoICJmb3JtZ2VuLWV4dC5qYXIiICkgKTsKLQotICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKLSAgICAgICAgfQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbGx5PC9zcGFuPgotICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotCi0gICAgfQotfQotPC9wcmU+Ci08L2Rpdj4KLQotPHA+T25jZSB0aGUgaW5zdGFsbCBhY3Rpb25zIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCwgeW91IHNob3VsZCBiZSBhYmxlIHRvIHNlbGVjdAotdGhlIEZvcm1HZW4gZmFjZXRzIG9uIHRoZSBGYWNldHMgU2VsZWN0aW9uIFBhZ2Ugb2YgdGhlIER5bmFtaWMgV2ViIFByb2plY3QgV2l6YXJkCi13aXRob3V0IGdldHRpbmcgYW55IGVycm9yIG1lc3NhZ2VzLiBZb3Ugc2hvdWxkIGFsc28gYmUgYWJsZSB0byBjb21wbGV0ZSB0aGUKLXByb2plY3QgY3JlYXRpb24gYW5kIHNlZSB0aGUgZm9sbG93aW5nIGhpZ2hsaWdodGVkIGFydGlmYWN0cyBpbiB0aGUgbmV3IHByb2plY3QuCi1UaGVzZSBhcnRpZmFjdHMgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIEZvcm1HZW4gZmFjZXQgaW5zdGFsbCBkZWxlZ2F0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wMy5naWYiLz48L2Rpdj4KLQotPGgyPjxhIG5hbWU9ImNyZWF0aW5nLmNhdGVnb3JpZXMiPjUuIENyZWF0aW5nIENhdGVnb3JpZXM8L2E+PC9oMj4KLQotPHA+UHJvamVjdCBmYWNldHMgY2FuIGJlIGdyb3VwZWQgaW50byBjYXRlZ29yaWVzIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlICJvbmUKLWNsaWNrIiBleHByaWVuY2UgZm9yIG5vdmljZSB1c2VycyBhbmQgcmV0YWluIHRoZSBmaW5lLWdyYWluZWQgY29udHJvbCBmb3IgYWR2YW5jZWQgCi11c2Vycy4gWW91IGFyZSB0b2xkIHRoYXQgbW9zdCBvZiBGb3JtR2VuIHVzZXJzIGFsd2F5cyBhZGQgYm90aCBvZiB0aGUgamFycyB0bwotdGhlaXIgd2ViIGFwcHMuIFRoZXNlIHVzZXJzIHdvdWxkIGJlbmVmaXQgZnJvbSBoYXZpbmcgdGhlIEZvcm1HZW4gZmFjZXRzIGdyb3VwZWQKLWludG8gYSBjYXRlZ29yeSBhbmQgc28gd2Ugd2lsbCBkbyBqdXN0IHRoYXQuPC9wPgotCi08cD5IZXJlIGlzIHdoYXQgdGhhdCBwYXJ0IG9mIHRoZSBleHRlbnNpb24gcG9pbnQgc2NoZW1hIGxvb2tzIGxpa2U6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0Ozwvc3Bhbj4KLSAgJmx0O2NhdGVnb3J5IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4mbHQ7L2Rlc2NyaXB0aW9uJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPihvcHRpb25hbCk8L3NwYW4+Ci0gICZsdDsvY2F0ZWdvcnkmZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDtwcm9qZWN0LWZhY2V0Jmd0Ozwvc3Bhbj4KLSAgICAmbHQ7Y2F0ZWdvcnkmZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4mbHQ7L2NhdGVnb3J5Jmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPihvcHRpb25hbCk8L3NwYW4+Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvcHJvamVjdC1mYWNldCZndDs8L3NwYW4+Ci08c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L2V4dGVuc2lvbiZndDs8L3NwYW4+Ci08L3ByZT4KLTwvZGl2PgotCi08cD5XZSBjYW4gbm93IGNyZWF0ZSBhIGNhdGVnb3J5IGFyb3VuZCB0aGUgRm9ybUdlbiBmYWNldHMuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0Ozwvc3Bhbj4KLQotICAmbHQ7Y2F0ZWdvcnkgaWQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+Zm9ybWdlbi5jYXRlZ29yeTwvc3Bhbj4iJmd0OwotICAgICZsdDtsYWJlbCZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPkZvcm1HZW48L3NwYW4+Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5FbmFibGVzIGdlbmVyYXRpb24gb2YgSFRNTCBmb3JtcyBiYXNlZCBvbiBYTUwgZGVmaW5pdGlvbiBmaWxlcy48L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgJmx0Oy9jYXRlZ29yeSZndDsKLQotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7cHJvamVjdC1mYWNldCBpZD0iZm9ybWdlbi5jb3JlIiZndDs8L3NwYW4+Ci0gICAgJmx0O2NhdGVnb3J5Jmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+Zm9ybWdlbi5jYXRlZ29yeTwvc3Bhbj4mbHQ7L2NhdGVnb3J5Jmd0OwotICA8c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7PC9zcGFuPgotCi0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDtwcm9qZWN0LWZhY2V0IGlkPSJmb3JtZ2VuLmV4dCImZ3Q7PC9zcGFuPgotICAgICZsdDtjYXRlZ29yeSZndDs8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPmZvcm1nZW4uY2F0ZWdvcnk8L3NwYW4+Jmx0Oy9jYXRlZ29yeSZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0Ozwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPHA+T25jZSB0aGUgYWJvdmUgY2hhbmdlIGhhcyBiZWVuIHB1dCBpbiBwbGFjZSwgdGhlIGZhY2V0cyBzZWxlY3Rpb24gcGFnZSBzaG91bGQgCi1sb29rIGxpa2UgdGhpczo8L3A+Ci0KLTxkaXYgY2xhc3M9InNjcmVlbi1zaG90Ij48aW1nIHNyYz0iaW1hZ2VzL3NjcmVlbjA0LmdpZiIvPjwvZGl2PgotCi08aDI+PGEgbmFtZT0iZGVjb3JhdGluZyI+Ni4gRGVjb3JhdGluZzwvYT48L2gyPgotCi08cD5DdXN0b20gaWNvbnMgY2FuIGJlIHByb3ZpZGVkIGZvciBmYWNldHMgYW5kIGNhdGVnb3JpZXMuIElmIGFuIGljb24gaXMgbm90Ci1wcm92aWRlZCwgYSBkZWZhdWx0IGljb24gaXMgdXNlZC4gVGhlIGljb25zIGFyZSBoZWxwZnVsIGFzIGEgd2F5IHRvIGJldHRlcgotZGlmZmVyZW50aWF0ZSBmYWNldHMgYW5kIHRvIG1ha2UgdGhlbSBzdGFuZCBvdXQuPC9wPgotCi08cD5IZXJlIGlzIHdoYXQgdGhhdCBleHRlbnNpb24gcG9pbnQgbG9va3MgbGlrZTo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiJmd0OwotICAmbHQ7aW1hZ2UgZmFjZXQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiBwYXRoPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAmbHQ7aW1hZ2UgY2F0ZWdvcnk9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiBwYXRoPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5Zb3VyIHN0YXJ0ZXIgcHJvamVjdCBjYW1lIHdpdGggdGhyZWUgaWNvbnMgaW4gdGhlIDxjb2RlPmljb25zPC9jb2RlPiBmb2xkZXIuCi1XZSB3aWxsIG5vdyBhc3NvY2lhdGUgdGhlbSB3aXRoIHRoZSBGb3JtR2VuIGZhY2V0cyBhbmQgdGhlIGNhdGVnb3J5LjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzPC9zcGFuPiImZ3Q7Ci0gICZsdDtpbWFnZSBmYWNldD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+IiBwYXRoPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmljb25zL2Zvcm1nZW4tY29yZS5naWY8L3NwYW4+Ii8mZ3Q7Ci0gICZsdDtpbWFnZSBmYWNldD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmV4dDwvc3Bhbj4iIHBhdGg9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+aWNvbnMvZm9ybWdlbi1leHQuZ2lmPC9zcGFuPiIvJmd0OwotICAmbHQ7aW1hZ2UgY2F0ZWdvcnk9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jYXRlZ29yeTwvc3Bhbj4iIHBhdGg9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+aWNvbnMvZm9ybWdlbi1jYXQuZ2lmPC9zcGFuPiIvJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5PbmNlIHRoZSBhYm92ZSBzbmlwcGV0IGhhcyBiZWVuIGFkZGVkIHRvIHlvdXIgcGx1Z2luLnhtbCBmaWxlLCB0aGUgZmFjZXRzCi1zZWxlY3Rpb24gcGFnZSBzaG91bGQgbG9vayBsaWtlIHRoaXM6PC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wNS5naWYiLz48L2Rpdj4KLQotPGgyPjxhIG5hbWU9ImFkZGluZy53aXphcmQucGFnZXMiPjcuIEFkZGluZyBXaXphcmQgUGFnZXM8L2E+PC9oMj4KLQotPHA+SXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGdhdGhlciB1c2VyIGlucHV0IHByaW9yIHRvIGluc3RhbGxpbmcgYSBmYWNldC4KLVRoZSBmcmFtZXdvcmsgYWxsb3dzIGEgc2VxdWVuY2Ugb2Ygd2l6YXJkIHBhZ2VzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBmYWNldAotYWN0aW9ucy4gVGhlIHN1cHBsaWVkIHdpemFyZCBwYWdlcyBhcmUgc2hvd24gYWZ0ZXIgdGhlIGZhY2V0cyBzZWxlY3Rpb24KLXBhZ2UuIEJhc2VkIG9uIHVzZXIgZmVlZGJhY2ssIHlvdSBrbm93biB0aGF0IEZvcm1HZW4gdXNlcnMgb2Z0ZW4gY3VzdG9taXplCi10aGUgVVJMIHBhdHRlcm4gb2YgdGhlIEZvcm1HZW4gc2VydmxldCBzbyB5b3Ugd291bGQgbGlrZSB0byBnaXZlIHRoZW0gdGhlIGFiaWxpdHkKLXRvIGRvIHRoYXQgaW4gdGhlIHdpemFyZCB3aGVuIHRoZSBGb3JtR2VuIGZhY2V0cyBhcmUgYmVpbmcgaW5zdGFsbGVkLjwvcD4KLQotPHA+SGVyZSBpcyB3aGF0IHRoZSByZWxldmFudCBwYXJ0cyBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50cyBsb29rIGxpa2U6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7YWN0aW9uJmd0Ozwvc3Bhbj4KLSAgICAmbHQ7Y29uZmlnLWZhY3RvcnkgY2xhc3M9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk8L3NwYW4+Ii8mZ3Q7Ci0gIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvYWN0aW9uJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotCi0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmRQYWdlczwvc3Bhbj4iJmd0OwotICAmbHQ7d2l6YXJkLXBhZ2VzIGFjdGlvbj0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigwIG9yIG1vcmUpPC9zcGFuPgotICAgICZsdDtwYWdlIGNsYXNzPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntjbGFzczpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSUZhY2V0V2l6YXJkUGFnZX08L3NwYW4+Ii8+IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDEgb3IgbW9yZSk8L3NwYW4+Ci0gICZsdDsvd2l6YXJkLXBhZ2VzJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7ICAKLTwvcHJlPgotPC9kaXY+Ci0KLTxwPk9uZSB0aGluZyB0byBub3RlIGhlcmUgaXMgdGhhdCBpbiBvcmRlciB0byBlbmFibGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQotZmFjZXQgYWN0aW9uIGRlbGVnYXRlIGFuZCB0aGUgd2l6YXJkIHBhZ2VzLCB3ZSBnbyBiYWNrIHRvIHRoZSBhY3Rpb24gZGVjbGFyYXRpb24KLWFuZCBwcm92aWRlIGFuIGFjdGlvbiBjb25maWcgZmFjdG9yeS4gVGhlIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBmYWN0b3J5IGlzIAotcG9wdWxhdGVkIGJ5IHRoZSB3aXphcmQgcGFnZXMgYW5kIGlzIHJlYWQgYnkgdGhlIGFjdGlvbiBkZWxlZ2F0ZS4gTm8gcmVzdHJpY3Rpb25zCi1hcmUgcGxhY2VkIG9uIHRoZSBzaGFwZSBvZiB0aGUgY29uZmlnIG9iamVjdC4gWW91IG1heSBjaG9vc2UgdG8gaW1wbGVtZW50IGEgY3VzdG9tCi1jbGFzcyBvciB5b3UgY2FuIHVzZSBhIHNvbWV0aGluZyBnZW5lcmljIGxpa2UgPGNvZGU+amF2YS51dGlsLkhhc2hNYXA8L2NvZGU+LjwvcD4KLQotPHA+QW5vdGhlciB0aGluZyB0byBub3RlIGlzIHRoYXQgdGhlIDxjb2RlPndpemFyZFBhZ2VzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgcmVmZXJzCi10byB0aGUgYWN0aW9ucyBieSB0aGVpciBpZHMsIHNvIGl0IGJlY29tZXMgbW9yZSBpbXBvcnRhbnQgdG8gZXhwbGljaXRseSBzcGVjaWZ5Ci10aGUgaWQgcmF0aGVyIHRoYW4gbGV0dGluZyB0aGUgZnJhbWV3b3JrIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb25lLjwvcD4KLQotPHA+SGVyZSBhcmUgdGhlIGludGVyZmFjZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgYWJvdmUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYTo8L3A+IAotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+PHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cGFja2FnZTwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIG1ldGhvZCBmb3IgY3JlYXRpbmcgCi0gKiBhIGNvbmZpZyBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHBhcmFtZXRlcml6aW5nIHRoZSBmYWNldCBhY3Rpb24KLSAqIGRlbGVnYXRlLgotICovPC9zcGFuPgotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgaW50ZXJmYWNlPC9zcGFuPiBJQWN0aW9uQ29uZmlnRmFjdG9yeQotewotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZmFjZXQgYWN0aW9uIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBUaGUgbmV3IGNvbmZpZ3VyYXRpb24KLSAgICAgKiBvYmplY3Qgc2hvdWxkIGlkZWFsbHkgYmUgcG9wdWxhdGVkIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cy4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IGEgbmV3IGZhY2V0IGFjdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHRocm93czwvc3Bhbj4gQ29yZUV4Y2VwdGlvbiBpZiBmYWlsZWQgd2hpbGUgY3JlYXRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0gICAgICovPC9zcGFuPgotICAgIAotICAgIE9iamVjdCBjcmVhdGUoKSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IENvcmVFeGNlcHRpb247Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+PHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cGFja2FnZTwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpOwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgd2l6YXJkIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBwcm9qZWN0Ci0gKiBmYWNldCBhY3Rpb25zLgotICovPC9zcGFuPgotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgaW50ZXJmYWNlPC9zcGFuPiBJRmFjZXRXaXphcmRQYWdlIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmV4dGVuZHM8L3NwYW4+IElXaXphcmRQYWdlCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogVGhlIGZyYW1ld29yayB3aWxsIGNhbGwgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgd2l6YXJkCi0gICAgICogY29udGV4dCB0byB0aGUgd2l6YXJkIHBhZ2UuIFRoZSB3aXphcmQgY29udGV4dCBjYW4gYmUgdXNlZCB0byBmaW5kIG91dAotICAgICAqIGFib3V0IG90aGVyIGFjdGlvbnMgYmVpbmcgY29uZmlndXJlZCBieSB0aGUgd2l6YXJkLgotICAgICAqIAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBjb250ZXh0IHRoZSB3aXphcmQgY29udGV4dAotICAgICAqLzwvc3Bhbj4KLSAgICAKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj52b2lkPC9zcGFuPiBzZXRXaXphcmRDb250ZXh0KCBJV2l6YXJkQ29udGV4dCBjb250ZXh0ICk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogVGhlIGZyYW1ld29yayB3aWxsIGNhbGwgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgYWN0aW9uIGNvbmZpZwotICAgICAqIG9iamVjdCB0aGF0IHRoZSB3aXphcmQgcGFnZSBzaG91bGQgc2F2ZSB1c2VyIHNlbGVjdGlvbiBpbnRvLiBUaGUKLSAgICAgKiBwb3B1bGF0ZWQgY29uZmlnIG9iamVjdCB3aWxsIHRoZW4gYmUgcGFzc2VkIHRvIHRoZSBhY3Rpb24gZGVsZWdhdGUuCi0gICAgICogCi0gICAgICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcGFyYW08L3NwYW4+IGNvbmZpZyB0aGUgYWN0aW9uIGNvbmZpZyBvYmplY3QKLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dm9pZDwvc3Bhbj4gc2V0Q29uZmlnKCBPYmplY3QgY29uZmlnICk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBwcmVzc2VkIHRoZSA8Y29kZT5GaW5pc2g8L2NvZGU+Ci0gICAgICogYnV0dG9uLiBJdCBhbGxvd3MgdGhlIHdpemFyZCBwYWdlIHRvIHRyYW5zZmVyIHVzZXIgc2VsZWN0aW9uIGludG8gdGhlCi0gICAgICogY29uZmlnIG9iamVjdC4gQWx0ZXJuYXRpdmUsIGluc3RlYWQgb2YgdXNpbmcgdGhpcyBtZXRob2QsIHRoZSB3aXphcmQKLSAgICAgKiBwYWdlIGNvdWxkIHVwZGF0ZSB0aGUgbW9kZWwgb24gdGhlIGZseSBhcyB0aGUgdXNlciBpcyBtYWtpbmcgY2hhbmdlcy4KLSAgICAgKi88L3NwYW4+Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj52b2lkPC9zcGFuPiB0cmFuc2ZlclN0YXRlVG9Db25maWcoKTsKLX0KLTwvcHJlPgotPC9kaXY+Ci0KLTxwPldlIHdpbGwgbm93IGltcGxlbWVudCBhIHdpemFyZCBwYWdlIGZvciB0aGUgPGNvZGU+ZmFjZXQuY29yZTwvY29kZT4gZmFjZXQKLWluc3RhbGwgYWN0aW9uLiBUaGUgd2l6YXJkIHBhZ2Ugd2lsbCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKLXNlcnZsZXQgVVJMIHBhdHRlcm4gZm9yIHRoZSBGb3JtR2VuIHNlcnZsZXQuPC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj48c3BhbiBjbGFzcz0iY29udGV4dC1jb2RlIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAmbHQ7cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmb3JtZ2VuLmNvcmUiIHZlcnNpb249IjEuMCImZ3Q7Ci0gICAgJmx0O2FjdGlvbiB0eXBlPSJJTlNUQUxMIjwvc3Bhbj4gaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlLmluc3RhbGw8L3NwYW4+IjxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZndDs8L3NwYW4+Ci0gICAgICAmbHQ7Y29uZmlnLWZhY3RvcnkgY2xhc3M9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuQ29yZUZhY2V0SW5zdGFsbENvbmZpZyRGYWN0b3J5PC9zcGFuPiIvJmd0OwotICAgIDxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDsvYWN0aW9uJmd0OwotICAmbHQ7L3Byb2plY3QtZmFjZXQtdmVyc2lvbiZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0Ozwvc3Bhbj4KLQotJmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXM8L3NwYW4+IiZndDsKLSAgJmx0O3dpemFyZC1wYWdlcyBhY3Rpb249IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlLmluc3RhbGw8L3NwYW4+IiZndDsKLSAgICAmbHQ7cGFnZSBjbGFzcz0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj5jb20uZm9ybWdlbi5lY2xpcHNlLkZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsUGFnZTwvc3Bhbj4iLz4KLSAgJmx0Oy93aXphcmQtcGFnZXMmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsgIAotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IGNvbS5mb3JtZ2VuLmVjbGlwc2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWcKLXsKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcml2YXRlPC9zcGFuPiBTdHJpbmcgdXJsUGF0dGVybiA9IDxzcGFuIGNsYXNzPSJqYXZhLWxpdGVyYWwiPiIqLmZvcm0iPC9zcGFuPjsKLQotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYzwvc3Bhbj4gU3RyaW5nIGdldFVybFBhdHRlcm4oKQotICAgIHsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cmV0dXJuIHRoaXM8L3NwYW4+LnVybFBhdHRlcm47Ci0gICAgfQotCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIHZvaWQ8L3NwYW4+IHNldFVybFBhdHRlcm4oIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBTdHJpbmcgdXJsUGF0dGVybiApCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aGlzPC9zcGFuPi51cmxQYXR0ZXJuID0gdXJsUGF0dGVybjsKLSAgICB9Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzPC9zcGFuPiBGYWN0b3J5IDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcGxlbWVudHM8L3NwYW4+IElBY3Rpb25Db25maWdGYWN0b3J5Ci0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWM8L3NwYW4+IE9iamVjdCBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5yZXR1cm4gbmV3PC9zcGFuPiBGb3JtR2VuQ29yZUZhY2V0SW5zdGFsbENvbmZpZygpOwotICAgICAgICB9Ci0gICAgfQotfQotPC9wcmU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IGNvbS5mb3JtZ2VuLmVjbGlwc2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQWJzdHJhY3RGYWNldFdpemFyZFBhZ2U7Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyBmaW5hbCBjbGFzczwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxQYWdlIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmV4dGVuZHM8L3NwYW4+IEFic3RyYWN0RmFjZXRXaXphcmRQYWdlCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHJpdmF0ZTwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWcgY29uZmlnOwotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnByaXZhdGU8L3NwYW4+IFRleHQgdXJsUGF0dGVyblRleHRGaWVsZDsKLQotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYzwvc3Bhbj4gRm9ybUdlbkNvcmVGYWNldEluc3RhbGxQYWdlKCkKLSAgICB7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnN1cGVyPC9zcGFuPiggPHNwYW4gY2xhc3M9ImphdmEtbGl0ZXJhbCI+ImZvcm1nZW4uY29yZS5mYWNldC5pbnN0YWxsLnBhZ2UiPC9zcGFuPiApOwotCi0gICAgICAgIHNldFRpdGxlKCA8c3BhbiBjbGFzcz0iamF2YS1saXRlcmFsIj4iRm9ybUdlbiBDb3JlIjwvc3Bhbj4gKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIDxzcGFuIGNsYXNzPSJqYXZhLWxpdGVyYWwiPiJDb25maWd1cmUgdGhlIEZvcm1HZW4gc2VydmxldC4iPC9zcGFuPiApOwotICAgIH0KLQotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnB1YmxpYyB2b2lkPC9zcGFuPiBjcmVhdGVDb250cm9sKCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gQ29tcG9zaXRlIHBhcmVudCApCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPm5ldzwvc3Bhbj4gQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPm5ldzwvc3Bhbj4gR3JpZExheW91dCggMSwgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmFsc2U8L3NwYW4+ICkgKTsKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gTGFiZWwgbGFiZWwgPSA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5uZXc8L3NwYW4+IExhYmVsKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEoIGdkaGZpbGwoKSApOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCA8c3BhbiBjbGFzcz0iamF2YS1saXRlcmFsIj4iVVJMIFBhdHRlcm46Ijwvc3Bhbj4gKTsKLQotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aGlzPC9zcGFuPi51cmxQYXR0ZXJuVGV4dEZpZWxkID0gPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+bmV3PC9zcGFuPiBUZXh0KCBjb21wb3NpdGUsIFNXVC5CT1JERVIgKTsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVyblRleHRGaWVsZC5zZXRMYXlvdXREYXRhKCBnZGhmaWxsKCkgKTsKLSAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+dGhpczwvc3Bhbj4udXJsUGF0dGVyblRleHRGaWVsZC5zZXRUZXh0KCB0aGlzLmNvbmZpZy5nZXRVcmxQYXR0ZXJuKCkgKTsKLQotICAgICAgICBzZXRDb250cm9sKCBjb21wb3NpdGUgKTsKLSAgICB9Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gc2V0Q29uZmlnKCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gT2JqZWN0IGNvbmZpZyApCi0gICAgewotICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aGlzPC9zcGFuPi5jb25maWcgPSAoRm9ybUdlbkNvcmVGYWNldEluc3RhbGxDb25maWcpIGNvbmZpZzsKLSAgICB9Ci0KLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCkKLSAgICB7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnRoaXM8L3NwYW4+LmNvbmZpZy5zZXRVcmxQYXR0ZXJuKCA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aGlzPC9zcGFuPi51cmxQYXR0ZXJuVGV4dEZpZWxkLmdldFRleHQoKSApOwotICAgIH0KLQotICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnByaXZhdGUgc3RhdGljPC9zcGFuPiBHcmlkRGF0YSBnZGhmaWxsKCkKLSAgICB7Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnJldHVybiBuZXc8L3NwYW4+IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKTsKLSAgICB9Ci19Ci08L3ByZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImphdmEtY29kZSI+PHNwYW4gY2xhc3M9ImphdmEtY29udGV4dCI+PHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5wYWNrYWdlPC9zcGFuPiBjb20uZm9ybWdlbi5lY2xpcHNlOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLTxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLTxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLTxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci08c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLTxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+cHVibGljIGZpbmFsIGNsYXNzPC9zcGFuPiBGb3JtR2VuQ29yZUZhY2V0SW5zdGFsbERlbGVnYXRlIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+aW1wbGVtZW50czwvc3Bhbj4gSURlbGVnYXRlCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5wdWJsaWMgdm9pZDwvc3Bhbj4gZXhlY3V0ZSggPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2plY3QgcGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gT2JqZWN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0LWtleXdvcmQiPmZpbmFsPC9zcGFuPiBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKQotCi0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+dGhyb3dzPC9zcGFuPiBDb3JlRXhjZXB0aW9uCi0KLSAgICB7Ci0gICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMiApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7PC9zcGFuPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnIGNmZwotICAgICAgICAgICAgICAgID0gKEZvcm1HZW5Db3JlRmFjZXRJbnN0YWxsQ29uZmlnKSBjb25maWc7Ci0KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQiPjxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWw8L3NwYW4+IElGb2xkZXIgd2ViSW5mTGliID0gVXRpbHMuZ2V0V2ViSW5mTGliRGlyKCBwaiApOwotCi0gICAgICAgICAgICBVdGlscy5jb3B5RnJvbVBsdWdpbiggPHNwYW4gY2xhc3M9ImphdmEtY29udGV4dC1rZXl3b3JkIj5uZXc8L3NwYW4+IFBhdGgoICJsaWJzL2Zvcm1nZW4tY29yZS5qYXIiICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViSW5mTGliLmdldEZpbGUoICJmb3JtZ2VuLWNvcmUuamFyIiApICk7Ci0KLSAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKCAxICk7PC9zcGFuPgotCi0gICAgICAgICAgICBVdGlscy5yZWdpc3RlckZvcm1HZW5TZXJ2bGV0KCBwaiwgY2ZnLmdldFVybFBhdHRlcm4oKSApOwotCi0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1jb250ZXh0Ij5tb25pdG9yLndvcmtlZCggMSApOwotICAgICAgICB9Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWNvbnRleHQta2V5d29yZCI+ZmluYWxseTwvc3Bhbj4KLSAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPHA+T25jZSB0aGUgYWJvdmUgY29kZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHlvdSBzaG91bGQgc2VlIGFub3RoZXIgcGFnZSBhcHBlYXIKLWluIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IFdpemFyZCBhZnRlciB0aGUgRm9ybUdlbiBmYWNldHMgYXJlIHNlbGVjdGVkLiBUaGUKLW5ldyBwYWdlIHdpbGwgYXBwZWFyIGFmdGVyIHRoZSBXZWIgTW9kdWxlIHBhZ2UsIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLTxjb2RlPmpzdC53ZWI8L2NvZGU+IGZhY2V0LiBUaGF0J3MgYmVjYXVzZSA8Y29kZT5mb3JtZ2VuLmNvcmU8L2NvZGU+IGZhY2V0Ci1kZXBlbmRzIG9uIHRoZSA8Y29kZT5qc3Qud2ViPC9jb2RlPiBmYWNldC4gSWYgdGhpcyBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCAKLXdhcyBub3Qgc3BlY2lmaWVkIHRoZSByZWxhdGl2ZSBvcmRlciBvZiB0aGVzZSBwYWdlcyB3b3VsZCBiZSB1bnNwZWNpZmllZC48L3A+Ci0KLTxkaXYgY2xhc3M9InNjcmVlbi1zaG90Ij48aW1nIHNyYz0iaW1hZ2VzL3NjcmVlbjA2LmdpZiIvPjwvZGl2PgotCi08aDI+PGEgbmFtZT0iZGVmaW5pbmcucHJlc2V0cyI+OC4gRGVmaW5pbmcgUHJlc2V0czwvYT48L2gyPgotCi08cD5BcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBmYWNldHMgZ3Jvd3MsIGl0IGJlY29tZXMgaW5jcmVhc2luZ2x5IGRpZmZpY3VsdAotZm9yIHRoZSB1c2VyIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY29tYmluYXRpb25zIG1ha2Ugc2Vuc2UuIFRoaXMgaXMgd2hlcmUgcHJlc2V0cwotY29tZSBpbi4gUHJlc2V0cyAob3IgQ29uZmlndXJhdGlvbnMsIGFzIHRoZXkgYXJlIHJlZmVycmVkIHRvIGluIHRoZSBVSSkgYXJlCi1zaW1wbHkgY29tYmluYXRpb25zIG9mIGZhY2V0cyB0aGF0IHNvbWVvbmUgaGFzIGRldGVybWluZWQgYXJlIHVzZWZ1bCBpbiBjZXJ0YWluCi1zaXR1YXRpb25zLiBQcmVzZXRzIGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSB1c2VyIG9yIHN1cHBsaWVkIHZpYSBhbiBleHRlbnNpb24KLXBvaW50LjwvcD4KLQotPHA+SGVyZSBpcyB0aGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBmb3IgZGVjbGFyaW5nIHByZXNldHM6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByZXNldHM8L3NwYW4+IiZndDsKLSAgJmx0O3N0YXRpYy1wcmVzZXQgaWQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+IiBleHRlbmRzPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Jmx0Oy9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4mbHQ7L2Rlc2NyaXB0aW9uJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPihvcHRpb25hbCk8L3NwYW4+Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIgdmVyc2lvbj0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57c3RyaW5nfTwvc3Bhbj4iLyZndDsgPHNwYW4gY2xhc3M9InNjaGVtYS1jb250cm9sIj4oMSBvciBtb3JlKTwvc3Bhbj4KLSAgJmx0Oy9zdGF0aWMtcHJlc2V0Jmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5Ob3RlIHRoYXQgaW4gb3JkZXIgZm9yIGEgcHJlc2V0IHRvIGFwcGx5IHRvIGEgZ2l2ZW4gZmFjZXRlZCBwcm9qZWN0LCB0aGUKLXByZXNldCBuZWVkcyB0byBpbmNsdWRlIGFsbCBvZiB0aGUgcHJvamVjdCdzICJmaXhlZCBmYWNldHMiLiBGaXhlZCBmYWNldHMgYXJlCi10aGUgZmFjZXRzIHRoYXQgYXJlIGtleSB0byB0aGUgcHJvcGVyIG9wZXJhdGlvbiBvZiB0aGF0IHByb2plY3QgdHlwZSBhbmQgc28KLWNhbm5vdCBiZSByZW1vdmVkLiBZb3UgY2FuIGlkZW50aWZ5IGZpeGVkIGZhY2V0cyBieSB0aGUgbG9jayBpY29uLjwvcD4KLQotPHA+TGV0J3Mgbm93IGNyZWF0ZSBhIHByZXNldCB0aGF0IGluY2x1ZGVzIGZvcm1nZW4gZmFjZXRzLjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzPC9zcGFuPiImZ3Q7Ci0gICZsdDtzdGF0aWMtcHJlc2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4ucHJlc2V0PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Rm9ybUdlbiBXZWIgUHJvamVjdDwvc3Bhbj4mbHQ7L2xhYmVsJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDs8c3BhbiBjbGFzcz0ieG1sLXRleHQiPkNyZWF0ZXMgYSB3ZWIgcHJvamVjdCB3aXRoIEZvcm1HZW4gZnVuY3Rpb25hbGl0eS48L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+anN0LmphdmE8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjUuMDwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+anN0LndlYjwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Mi4yPC9zcGFuPiIvJmd0OwotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmNvcmU8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjEuMDwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+IiB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPjEuMDwvc3Bhbj4iLyZndDsKLSAgJmx0Oy9zdGF0aWMtcHJlc2V0Jmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5IZXJlIGlzIGhvdyB0aGUgcHJlc2V0IHNob3dzIHVwIG9uIHRoZSBmYWNldHMgc2VsZWN0aW9uIHBhZ2U6PC9wPgotCi08ZGl2IGNsYXNzPSJzY3JlZW4tc2hvdCI+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4wNy5naWYiLz48L2Rpdj4KLQotPHA+VGhlIHByZXNldCBjYW4gYWxzbyBiZSBzZWxlY3RlZCBvbiB0aGUgZmlyc3QgcGFnZSBvZiBhbGwgV1RQIHByb2plY3QKLWNyZWF0aW9uIHdpemFyZHMuIEhlcmUgaXMgaG93IHRoaXMgbG9va3MgaW4gdGhlIER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkOjwvcD4KLQotPGRpdiBjbGFzcz0ic2NyZWVuLXNob3QiPjxpbWcgc3JjPSJpbWFnZXMvc2NyZWVuMDguZ2lmIi8+PC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJydW50aW1lLm1hcHBpbmdzIj45LiBTcGVjaWZ5aW5nIFJ1bnRpbWUgU3VwcG9ydCBNYXBwaW5nczwvYT48L2gyPgotCi08cD5PbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyBvZiB0aGUgZmFjZXRlZCBwcm9qZWN0IGZyYW1ld29yayBpcyB0bwotYmUgYWJsZSB0byBhY2N1cmF0ZWx5IG1vZGVsIHdoZXRoZXIgYSBjZXJ0YWluIHNlcnZlciBydW50aW1lIHN1cHBvcnRzIGEKLWdpdmVuIHByb2plY3QuIFdlIGRvIHRoYXQgYnkgIm1hcHBpbmciIHByb2plY3QgZmFjZXRzIHRvIHJ1bnRpbWUgY29tcG9uZW50cwotdGhhdCBzdXBwb3J0IHRoZW0uIElmIHRoZSBhcnRpZmFjdHMgY3JlYXRlZCBieSBhIGZhY2V0IHdpbGwgcnVuIG9uIGFueSBzZXJ2ZXIKLXRoYXQgc3VwcG9ydHMgYWxsIG9mIHRoZSBmYWNldCdzIHVwc3RyZWFtIGRlcGVuZGVuY2llcywgdGhlbiB0aGUgPGNvZGU+YW55PC9jb2RlPgotd2lsZGNhcmQgY2FuIGJlIHVzZWQuPC9wPgotCi08cD5JdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgZXZlcnkgZmFjZXQgbmVlZHMgdG8gc3BlY2lmeSBhIHN1cHBvcnQgbWFwcGluZyBvZgotc29tZSBraW5kLiBGYWNldHMgdGhhdCBkb24ndCBzcGVjaWZ5IGFueSBzdXBwb3J0IG1hcHBpbmdzIGFyZSB0cmVhdGVkIGFzIG5vdAotc3VwcG9ydGVkIGJ5IGFueSBydW50aW1lLCB3aGljaCBpcyBub3QgdmVyeSB1c2VmdWwuPC9wPgotCi08cD5IZXJlIGlzIHRoZSBleHRlbnNpb24gcG9pbnQgdGhhdCdzIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIHN1cHBvcnQgbWFwcGluZ3M6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzPC9zcGFuPiImZ3Q7Ci0gICZsdDtzdXBwb3J0ZWQmZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDAgb3IgbW9yZSk8L3NwYW4+Ci0gICAgJmx0O3J1bnRpbWUtY29tcG9uZW50IGFueT0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj57Ym9vbGVhbn08L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KG9wdGlvbmFsKTwvc3Bhbj4KLSAgICAmbHQ7cnVudGltZS1jb21wb25lbnQgaWQ9IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+e3N0cmluZ308L3NwYW4+Ii8gdmVyc2lvbj0iPHNwYW4gY2xhc3M9InNjaGVtYS10eXBlIj48c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUtbGluayI+ezxhIGhyZWY9IiN2ZXJzaW9uLmV4cHJlc3Npb25zIj52ZXJzaW9uLmV4cHI8L2E+fTwvc3Bhbj48L3NwYW4+Ii8mZ3Q7IDxzcGFuIGNsYXNzPSJzY2hlbWEtY29udHJvbCI+KDAgb3IgbW9yZSk8L3NwYW4+Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntzdHJpbmd9PC9zcGFuPiIvIHZlcnNpb249IjxzcGFuIGNsYXNzPSJzY2hlbWEtdHlwZSI+PHNwYW4gY2xhc3M9InNjaGVtYS10eXBlLWxpbmsiPns8YSBocmVmPSIjdmVyc2lvbi5leHByZXNzaW9ucyI+dmVyc2lvbi5leHByPC9hPn08L3NwYW4+PC9zcGFuPiIvJmd0OyA8c3BhbiBjbGFzcz0ic2NoZW1hLWNvbnRyb2wiPigxIG9yIG1vcmUpPC9zcGFuPgotICAmbHQ7L3N1cHBvcnRlZCZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L2Rpdj4KLQotPHA+VGhlIDxjb2RlPiZsdDtzdXBwb3J0ZWQmZ3Q7PC9jb2RlPiBibG9jayBjYW4gcmVmZXJlbmNlIGFueSBudW1iZXIgb2YgcnVudGltZQotY29tcG9uZW50cyBhcyB3ZWxsIGFzIGFueSBudW1iZXIgb2YgZmFjZXRzLiBUaGUgc2VtYW50aWNzIG9mIHRoYXQgaXMgdG8gZGVjbGFyZSAKLWFzIHN1cHBvcnRlZCBldmVyeSBjb21iaW5hdGlvbiBpbiB0aGUgcmVzdWx0aW5nIGNyb3NzLXByb2R1Y3QuPC9wPiAKLQotPHA+VGhlIDxjb2RlPnZlcnNpb248L2NvZGU+IGF0dHJpYnV0ZXMgb2YgdGhlIDxjb2RlPiZsdDtydW50aW1lLWNvbXBvbmVudCZndDs8L2NvZGU+IAotYW5kIDxjb2RlPiZsdDtmYWNldCZndDs8L2NvZGU+IGVsZW1lbnRzIGNhbiBiZSBvbWl0dGVkIHRvIGluY2x1ZGUgYWxsIHZlcnNpb25zLjwvcD4KLQotPHA+VGhlIEZvcm1HZW4gZmFjZXRzIGRvbid0IGhhdmUgYW55IHNwZWNpYWwgc3VwcG9ydCByZXF1aXJlbWVudHMuIFRoZXkgd2lsbCBydW4KLW9uIGFueSBzZXJ2ZXIgdGhhdCBzdXBwb3J0cyB0aGUgajJlZSBzZXJ2bGV0IHNwZWMuIFdlIHdpbGwgdXNlIHRoZSA8Y29kZT5hbnk8L2NvZGU+Ci13aWxkY2FyZCB0byBkZXNpZ25hdGUgdGhhdC48L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPiZsdDtleHRlbnNpb24gcG9pbnQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXM8L3NwYW4+IiZndDsKLSAgJmx0O3N1cHBvcnRlZCZndDsKLSAgICAmbHQ7cnVudGltZS1jb21wb25lbnQgYW55PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPnRydWU8L3NwYW4+Ii8mZ3Q7Ci0gICAgJmx0O2ZhY2V0IGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPmZvcm1nZW4uY29yZTwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5leHQ8L3NwYW4+Ii8mZ3Q7Ci0gICZsdDsvc3VwcG9ydGVkJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08cD5BbHRlcm5hdGl2ZSwgaWYgZm9yIHNvbWUgcmVhc29uIHRoZSBGb3JtR2VuIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgYSBzcGVjaWZpYwotcnVudGltZSwgc3VjaCBhcyBUb21jYXQsIHdlIHdvdWxkIHVzZSBzb21ldGhpbmcgbGlrZSB0aGUgdGhpcyBpbnN0ZWFkOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJjb2RlLXhtbCI+Jmx0O2V4dGVuc2lvbiBwb2ludD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lczwvc3Bhbj4iJmd0OwotICAmbHQ7c3VwcG9ydGVkJmd0OwotICAgICZsdDtydW50aW1lLWNvbXBvbmVudCBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdDwvc3Bhbj4iIHZlcnNpb249IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+WzUuMDwvc3Bhbj4iLyZndDsKLSAgICAmbHQ7ZmFjZXQgaWQ9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIvJmd0OwotICAgICZsdDtmYWNldCBpZD0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij5mb3JtZ2VuLmV4dDwvc3Bhbj4iLyZndDsKLSAgJmx0Oy9zdXBwb3J0ZWQmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC9kaXY+Ci0KLTxwPlRoZSBhYm92ZSBtb3JlIHJlc3RyaWN0aXZlIHNwZWNpZmljYXRpb24gd2lsbCBwcmV2ZW50IEZvcm1HZW4gZmFjZXRzIGZyb20KLWJlaW5nIHNlbGVjdGVkIGlmIHRoZSBwcm9qZWN0IGlzIHRhcmdldHRlZCB0byBhbnkgcnVudGltZSBvdGhlciB0aGFuIEFwYWNoZQotVG9tY2F0IDUuMCBvciBuZXdlci48L3A+Ci0KLTxoMj48YSBuYW1lPSJzdW1tYXJ5Ij4xMC4gU3VtbWFyeTwvYT48L2gyPgotCi08cD5JbiB0aGlzIHR1dG9yaWFsIHdlIGNyZWF0ZWQgdHdvIGZ1bGx5LWZ1bmN0aW9uYWwgcHJvamVjdCBmYWNldHMgYnkgc3BlY2lmeWluZwotY29uc3RyYWludHMsIGltcGxlbWVudGluZyBhY3Rpb25zLCBncm91cGluZyBmYWNldHMgaW50byBjYXRlZ29yaWVzLCBhbmQgY3JlYXRpbmcKLXdpemFyZCBwYWdlcyB0byBhbGxvdyB1c2VycyB0byBwYXJhbWV0ZXJpemUgZmFjZXQgaW5zdGFsbGF0aW9uLiBZb3Ugc2hvdWxkIG5vdwotYmUgd2VsbCBwcmVwYXJlZCB0byBjcmVhdGUgeW91ciBvd24gZmFjZXRzLiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkCi1ieSB0aGlzIHR1dG9yaWFsIGNhbiBiZSBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIGFwcGVuZGl4IHNlY3Rpb25zLjwvcD4gCi0KLTxoMj48YSBuYW1lPSJjdXN0b20udmVyc2lvbi5jb21wYXJhdG9ycyI+QXBwZW5kaXggQTogQ3VzdG9tIFZlcnNpb24gQ29tcGFyYXRvcnM8L2E+PC9oMj4KLQotPHA+VGhlIGZhY2V0ZWQgcHJvamVjdCBmcmFtZXdvcmsgbmVlZHMgdG8gYmUgYWJsZSB0byBjb21wYXJlIGZhY2V0IHZlcnNpb24KLXN0cmluZ3MuIFRoZSBmcmFtZXdvcmsgc3VwcGxpZXMgYSBkZWZhdWx0IHZlcnNpb24gY29tcGFyYXRvciB0aGF0IGNhbiBoYW5kbGUKLXZlcnNpb24gc3RyaW5ncyBlbmNvZGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBkZWNpbWFsIG5vdGF0aW9uIChzdWNoIGFzIDEuMiBvcgotNS42Ni41NTMzKSwgYnV0IGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBmb3JtYXQgeW91IHdpbGwgbmVlZCB0byBzdXBwbHkKLWEgY3VzdG9tIHZlcnNpb24gY29tcGFyYXRvci48L3A+Ci0KLTxwPkhlcmUgaXMgaG93IHlvdSBwbHVnIGluIGEgY3VzdG9tIHZlcnNpb24gY29tcGFyYXRvcjo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iY29kZS14bWwiPjxzcGFuIGNsYXNzPSJjb250ZXh0LWNvZGUiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0Jmd0Ozwvc3Bhbj4KLSAgICAmbHQ7dmVyc2lvbi1jb21wYXJhdG9yIGNsYXNzPSI8c3BhbiBjbGFzcz0ic2NoZW1hLXR5cGUiPntjbGFzczpqYXZhLnV0aWwuQ29tcGFyYXRvciZsdDtTdHJpbmcmZ3Q7fTwvc3Bhbj4iLyZndDsKLSAgPHNwYW4gY2xhc3M9ImNvbnRleHQtY29kZSI+Jmx0Oy9wcm9qZWN0LWZhY2V0Jmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7PC9zcGFuPgotPC9wcmU+Ci08L2Rpdj4KLQotPHA+V2hlbiBpbXBsZW1lbnRpbmcgYSB2ZXJzaW9uIGNvbXBhcmF0b3IgeW91IGNhbiBlaXRoZXIgc3RhcnQgZnJvbSBzY3JhdGNoCi1vciBzdWJjbGFzcyB0aGUgZGVmYXVsdCB2ZXJzaW9uIGNvbXBhcmF0b3IgKDxjb2RlPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkRlZmF1bHRWZXJzaW9uQ29tcGFyYXRvcjwvY29kZT4pLgotU3ViY2xhc3NpbmcgdGhlIGRlZmF1bHQgdmVyc2lvbiBjb21wYXJhdG9yIG1ha2VzIHNlbnNlIGlmIHRoZSB2ZXJzaW9uIGZvcm1hdAotZGlmZmVycyBvbmx5IHNsaWdodGx5IGZyb20gdGhlIGRlZmF1bHQgZm9ybWF0LCBzdWNoIGFzIHVzaW5nIHNlcGFyYXRvcnMgb3RoZXIKLXRoYW4gZG90cyBvciBoYXZpbmcgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBhdCBjZXJ0YWluIHBvc2l0aW9ucy4gSGVyZSBhcmUgdGhlCi1wcm90ZWN0ZWQgbWV0aG9kcyBleHBvc2VkIGJ5IHRoZSA8Y29kZT5EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3I8L2NvZGU+IGNsYXNzCi10aGF0IGFyZSBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWNvbW1lbnQiPi8qKgotICogUmV0dXJucyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlCi0gKiB1c2VkIHdoZW4gYnJlYWtpbmcgdGhlIHZlcnNpb24gc3RyaW5nIGludG8gc2VnbWVudHMuIFRoZSBkZWZhdWx0Ci0gKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zICIuIi4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gKiAKLSAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHJldHVybjwvc3Bhbj4gdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXJzCi0gKi88L3NwYW4+Ci0gICAgCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5wcm90ZWN0ZWQ8L3NwYW4+IFN0cmluZyBnZXRTZXBhcmF0b3JzKCk7Ci0gICAgCi08c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFBhcnNlcyBhIHNlZ21lbnQgb2YgdGhlIHZlcnNpb24gc3RyaW5nLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwYXJzZXMKLSAqIHRoZSBmaXJzdCBzZWdtZW50IGFzIGFuIGludGVnZXIgKGxlYWRpbmcgemVyb2VzIGFyZSBpZ25vcmVkKSBhbmQgdGhlCi0gKiByZXN0IG9mIHRoZSBzZWdtZW50cyBhcyBkZWNpbWFscyAobGVhZGluZyB6ZXJvZXMgYXJlIGtlcHQpLiBTdWJjbGFzc2VzIAotICogY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgY3VzdG9tIHBhcnNpbmcgZm9yIGFueSBudW1iZXIgb2YgCi0gKiBzZWdtZW50cy4KLSAqIAotICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AcGFyYW08L3NwYW4+IHZlcnNpb24gdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcKLSAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBzZWdtZW50IHRoZSB2ZXJzaW9uIHNlZ21lbnQKLSAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhlIHNlZ21lbnQgaW4gdGhlIHZlcnNpb24gc3RyaW5nCi0gKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlZ21lbnQgYXMgYSB7QHNlZSBDb21wYXJhYmxlfQotICogPHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5AdGhyb3dzPC9zcGFuPiBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uIGlmIGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcKLSAqLzwvc3Bhbj4KLSAgICAKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnByb3RlY3RlZDwvc3Bhbj4gQ29tcGFyYWJsZSBwYXJzZSggPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+ZmluYWw8L3NwYW4+IFN0cmluZyB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmZpbmFsPC9zcGFuPiBTdHJpbmcgc2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5maW5hbDwvc3Bhbj4gaW50IHBvc2l0aW9uICkKLSAgICAKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj50aHJvd3M8L3NwYW4+IFZlcnNpb25Gb3JtYXRFeGNlcHRpb247Ci08L3ByZT4KLTwvZGl2PgotCi08aDI+PGEgbmFtZT0idmVyc2lvbi5leHByZXNzaW9ucyI+QXBwZW5kaXggQjogVmVyc2lvbiBFeHByZXNzaW9uczwvYT48L2gyPgotCi08cD5BIHZlcnNpb24gZXhwcmVzc2lvbiBpcyBhIHN5bnRheCBmb3Igc3BlY2lmeWluZyBtb3JlIHRoYW4gb25lIHZlcnNpb24uIFRoZQotdmVyc2lvbiBleHByZXNzaW9ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBmcmFtZXdvcmsncyBleHRlbnNpb24gcG9pbnRzLCBidXQKLXlvdSB3aWxsIG1vc3QgbGlrZWx5IGZpcnN0IGVuY291bnRlciB0aGVtIHdoaWxlIHNwZWNpZnlpbmcgdGhlIDxjb2RlPnJlcXVpcmVzPC9jb2RlPiAKLWNvbnN0cmFpbnQuPC9wPgotCi08cD5BIHZlcnNpb24gZXhwcmVzc2lvbiBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAKLVRoZSBjb21tYXMgZnVuY3Rpb24gYXMgYW4gT1Igb3BlcmF0aW9uLiBFYWNoIHNlZ21lbnQgaXMgZWl0aGVyIGEgc2luZ2xlIHZlcnNpb24sIAotYSByYW5nZSwgb3IgYSB3aWxkY2FyZC4gUmFuZ2VzIGFyZSByZXByZXNlbnRlZCBieSBicmFja2V0IGFuZCBkYXNoIG5vdGF0aW9uIHN1Y2ggCi1hcyBbeC15KS4gQSBicmFja2V0IG1lYW5zIGluY2x1c2l2ZSwgd2hpbGUgdGhlIHBhcmVudGhlc2lzIG1lYW5zIGV4Y2x1c2l2ZS4gT3BlbiAKLWVuZGVkIHJhbmdlcyBhcmUgYWxzbyBzdXBwb3J0ZWQuIEEgd2lsZGNhcmQgKHJlcHJlc2VudGVkIGJ5ICcqJyBjaGFyYWN0ZXIpIGNhbgotYmUgdXNlZCB0byBtYXRjaCBhbnkgdmVyc2lvbi4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgd2lsZGNhcmQgdG8gbWF0Y2gKLXBhcnQgb2YgdGhlIHZlcnNpb24gc3RyaW5nLjwvcD4KLQotPHA+SGVyZSBhcmUgc29tZSBleGFtcGxlczo8L3A+Ci0KLTxkaXYgY2xhc3M9ImNvZGUiPgotPHByZSBjbGFzcz0iamF2YS1jb2RlIj4xLjIKLTEuMiwxLjUsMy4yCi1bMS4yLTMuMl0KLVszLjctNS4wKQotWzMuNwotNS4wKQotMS4yLFszLjAtNC41KSxbNy4zCi0qCi08L3ByZT4KLTwvZGl2PgotCi08aDI+PGEgbmFtZT0icHJvcGVydHkudGVzdGVyIj5BcHBlbmRpeCBDOiBQcm9wZXJ0eSBUZXN0ZXI8L2E+PC9oMj4KLQotPHA+QSBwcm9wZXJ0eSB0ZXN0ZXIgaXMgcHJvdmlkZWQgYnkgdGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgdGhhdCBhbGxvd3MKLXRoZSBwcmVzZW5jZSBvZiB0aGUgZmFjZXQgaW4gYSBwcm9qZWN0IHRvIGJlIHRlc3RlZCBieSBhbnkgZXh0ZW5zaW9uIHBvaW50IHRoYXQKLXdvcmtzIHdpdGggPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uczwvY29kZT4gcGFja2FnZS4gVGhlIG1vc3QgY29tbW9uCi11c2FnZSBpcyB0byBlbmFibGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgKHN1Y2ggYXMgYWN0aW9ucyBhbmQgcHJvamVjdCBwcm9wZXJ0eQotcGFnZXMpLiBUaGUgcHJvcGVydHkgbmFtZSBpcyA8Y29kZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQ8L2NvZGU+Ci1hbmQgdGhlIHZhbHVlIGlzIGVpdGhlciBhIGZhY2V0IGlkIG9yIGEgZmFjZXQgaWQgZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQKLWEgPGEgaHJlZj0iI3ZlcnNpb24uZXhwcmVzc2lvbnMiPnZlcnNpb24gZXhwcmVzc2lvbjwvYT4uPC9wPgotCi08cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgZmFjZXRzIHByb3BlcnR5IHRlc3RlciB0byBjb250cm9sIGVuYWJsZW1lbnQgb2YKLWEgcHJvamVjdCBwcm9wZXJ0aWVzIHBhZ2U6PC9wPgotCi08ZGl2IGNsYXNzPSJjb2RlIj4KLTxwcmUgY2xhc3M9ImNvZGUteG1sIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXM8L3NwYW4+IiZndDsKLSAgJmx0O3BhZ2UgCi0gICAgYWRhcHRhYmxlPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPnRydWU8L3NwYW4+IgotICAgIG9iamVjdENsYXNzPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0PC9zcGFuPiIKLSAgICBuYW1lPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPkZvcm1HZW4gUHJvcGVydGllczwvc3Bhbj4iCi0gICAgY2xhc3M9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Y29tLmZvcm1nZW4uZWNsaXBzZS5Gb3JtR2VuUHJvcGVydGllc1BhZ2U8L3NwYW4+IgotICAgIGlkPSI8c3BhbiBjbGFzcz0ieG1sLXRleHQiPm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlPC9zcGFuPiImZ3Q7Ci0gICAgJmx0O2VuYWJsZWRXaGVuJmd0OwotICAgICAgJmx0O3Rlc3QgCi0gICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0iPHNwYW4gY2xhc3M9InhtbC10ZXh0Ij50cnVlPC9zcGFuPiIKLSAgICAgICAgcHJvcGVydHk9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0PC9zcGFuPiIKLSAgICAgICAgdmFsdWU9IjxzcGFuIGNsYXNzPSJ4bWwtdGV4dCI+Zm9ybWdlbi5jb3JlPC9zcGFuPiIvJmd0OwotICAgICZsdDsvZW5hYmxlZFdoZW4mZ3Q7ICAgICAgICAgIAotICAmbHQ7L3BhZ2UmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC9kaXY+Ci0KLTxoMj48YSBuYW1lPSJ3aXphcmQuY29udGV4dCI+QXBwZW5kaXggRDogV2l6YXJkIENvbnRleHQ8L2E+PC9oMj4KLQotPHA+U29tZXRpbWVzIGl0IGRlc2lyYWJsZSB0byBiZSBhYmxlIHRvIGFkanVzdCB0aGUgYmVoYXZpb3Igb2YgZmFjZXQgYWN0aW9uIAotd2l6YXJkIHBhZ2VzIGJhc2VkIG9uIHVzZXIgaW5wdXQgaW4gdGhlIHdpemFyZCBwYWdlcyBvZiBvdGhlciBmYWNldHMuIFRoZQotPGNvZGU+SVdpemFyZENvbnRleHQ8L2NvZGU+IGludGVyZmFjZSBjYW4gYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBUaGUgd2l6YXJkCi1wYWdlIGdldHMgYSBoYW5kbGUgb24gPGNvZGU+SVdpemFyZENvbnRleHQ8L2NvZGU+IGludGVyZmFjZSB3aGVuIGl0J3MKLTxjb2RlPnNldFdpemFyZENvbnRleHQ8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIFdoZW4gd3JpdGluZyBjb2RlIHRoYXQgcmVsaWVzCi1vbiB0aGUgd2l6YXJkIGNvbnRleHQsIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBwb2ludHMgeW91IHNob3VsZCBrZWVwIGluIG1pbmQuPC9wPgotCi08b2w+Ci0KLSAgPGxpPjxwPlRoZSBmYWNldCB3aG9zZSB2YWx1ZSB5b3Ugd2lzaCB0byBjaGVjayBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkCi0gICAgaW4gdGhlIHBhc3QuIEluIHRoYXQgY2FzZSB5b3Ugd2lsbCBub3QgZmluZCBpdCdzIGluc3RhbGwgY29uZmlndXJhdGlvbiBpbgotICAgIHRoZSB3aXphcmQgY29udGV4dC4gWW91IHdpbGwgbmVlZCB0byB3cml0ZSBjb25kaXRpb25hbCBsb2dpYyB0aGF0IHdpbGwKLSAgICBjb25zdWx0IHRoZSB3aXphcmQgY29udGV4dCBvciBsb29rcyBhdCBwcm9qZWN0IHN0YXRlIG9uIGRpc2suPC9wPjwvbGk+Ci0gICAgCi0gIDxsaT48cD5Zb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHByb3ZpZGVkIGluIHlvdXIKLSAgICBjb25maWcgb2JqZWN0IGZvciB0aGUgQVBJLW9ubHkgc2NlbmFyaW8gd2hlcmUgeW91ciB3aXphcmQgcGFnZSB3aWxsIG5vdCBiZQotICAgIGludm9sdmVkLjwvcD4KLSAgICAKLTwvb2w+Ci0KLTxwPkhlcmUgaXMgd2hhdCB0aGUgPGNvZGU+SVdpemFyZENvbnRleHQ8L2NvZGU+IGludGVyZmFjZSBsb29rcyBsaWtlOjwvcD4KLQotPGRpdiBjbGFzcz0iY29kZSI+Ci08cHJlIGNsYXNzPSJqYXZhLWNvZGUiPjxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPnBhY2thZ2U8L3NwYW4+IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTsKLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBqYXZhLnV0aWwuU2V0OwotCi08c3BhbiBjbGFzcz0iamF2YS1rZXl3b3JkIj5pbXBvcnQ8L3NwYW4+IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+aW1wb3J0PC9zcGFuPiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLTxzcGFuIGNsYXNzPSJqYXZhLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotCi08c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAqIFRoZSBpbnRlcmZhY2UgZXhwb3NlZCB0byB0aGUgZmFjZXQgYWN0aW9uIHdpemFyZCBwYWdlcyB0aGF0IGFsbG93cyB0aGVtCi0gKiB0byBnYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdpemFyZCBzdGF0ZS4KLSAqLzwvc3Bhbj4KLQotPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+cHVibGljIGludGVyZmFjZTwvc3Bhbj4gSVdpemFyZENvbnRleHQgCi17Ci0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSB3aXphcmQgaXMgb3BlcmF0aW5nIG9uLiBJZiB0aGUKLSAgICAgKiB3aXphcmQgaXMgaW4gdGhlIHByb2plY3QgY3JlYXRpb24gbW9kZSwgdGhlIHByb2plY3Qgd2lsbCBub3QgeWV0IGV4aXN0Ci0gICAgICogaW4gdGhlIHdvcmtzcGFjZS4KLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIHdpemFyZCBpcyBvcGVyYXRpbmcgb24KLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEtY29tbWVudCI+LyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGZhY2V0cyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIHdpemFyZC4gSWYgdGhlIHdpemFyZAotICAgICAqIGlzIGluIHRoZSBhZGQvcmVtb3ZlIGZhY2V0cyBtb2RlICh2cy4gcHJvamVjdCBjcmVhdGlvbiksIHRoaXMgbWV0aG9kIHdpbGwgCi0gICAgICogcmV0dXJuIHRoZSBzZXQgb2YgZmFjZXRzIGN1cnJlbnRseSBpbnN0YWxsZWQgaW4gYSBwcm9qZWN0IGFmdGVyIGJlaW5nIAotICAgICAqIG1vZGlmaWVkIGJ5IHRoZSBjdXJyZW50IHNldCBvZiBhY3Rpb25zLiAKLSAgICAgKiAKLSAgICAgKiA8c3BhbiBjbGFzcz0iamF2YS1qYXZhZG9jLWtleXdvcmQiPkByZXR1cm48L3NwYW4+IHRoZSBzZXQgb2YgZmFjZXRzIGN1cnJlbnRseSBzZWxlY3RlZCBpbiB0aGUgd2l6YXJkIChlbGVtZW50IHR5cGU6Ci0gICAgICogICB7PHNwYW4gY2xhc3M9ImphdmEtamF2YWRvYy1rZXl3b3JkIj5Ac2VlPC9zcGFuPiBJUHJvamVjdEZhY2V0VmVyc2lvbn0pCi0gICAgICovPC9zcGFuPgotICAgIAotICAgIFNldCBnZXRTZWxlY3RlZFByb2plY3RGYWNldHMoKTsKLSAgICAKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmYWNldCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlCi0gICAgICogd2l6YXJkLiBTZWUge0BzZWUgZ2V0U2VsZWN0ZWRQcm9qZWN0RmFjZXRzKCl9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAqIAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBmdiB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIG9iamVjdAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHJldHVybjwvc3Bhbj4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gb25seSBpZiB0aGUgcHJvdmlkZWQgcHJvamVjdCBmYWNldCBpcwotICAgICAqICAgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSB3aXphcmQKLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgPHNwYW4gY2xhc3M9ImphdmEta2V5d29yZCI+Ym9vbGVhbjwvc3Bhbj4gaXNQcm9qZWN0RmFjZXRTZWxlY3RlZCggSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgICAKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWN0aW9ucyBjdXJyZW50bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotICAgICAqIAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHJldHVybjwvc3Bhbj4gdGhlIHNldCBvZiBhY3Rpb25zIGN1cnJlbnRseSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgU2V0IGdldEFjdGlvbnMoKTsKLSAgICAKLSAgICA8c3BhbiBjbGFzcz0iamF2YS1jb21tZW50Ij4vKioKLSAgICAgKiBGaW5kcyB0aGUgYWN0aW9uIG9mIHNwZWNpZmllZCB0eXBlIHRoYXQgYXBwbGllcyB0byB0aGUgc3BlY2lmaWVkIGZhY2V0LAotICAgICAqIGlmIHN1Y2ggYWN0aW9uIGV4aXN0cy4gSWYgdGhlIHdpemFyZCBpcyBpbiB0aGUgYWRkL3JlbW92ZSBmYWNldHMgbW9kZQotICAgICAqICh2cy4gcHJvamVjdCBjcmVhdGlvbiksIHlvdSBjYW5ub3QgZGVwZW5kIG9uIGZpbmRpbmcgdGhlIGluc3RhbGwgYWN0aW9uCi0gICAgICogZm9yIGEgcmVxdWlyZWQgZmFjZXQgYXMgdGhhdCBmYWNldCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkLgotICAgICAqIAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiB0eXBlIHRoZSBhY3Rpb24gdHlwZQotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHBhcmFtPC9zcGFuPiBmdiB0aGUgcHJvamVjdCBmYWNldCB2ZXJzaW9uIG9iamVjdAotICAgICAqIDxzcGFuIGNsYXNzPSJqYXZhLWphdmFkb2Mta2V5d29yZCI+QHJldHVybjwvc3Bhbj4gdGhlIGFjdGlvbiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi88L3NwYW4+Ci0gICAgCi0gICAgQWN0aW9uIGdldEFjdGlvbiggQWN0aW9uLlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApOwotfQotPC9wcmU+Ci08L2Rpdj4KLQotPGJyLz48YnIvPjxici8+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzE1MC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzE1MC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU0ODA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcxNTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+V2hhdCdzIE5ldyBmb3IgMS41PzwvdGl0bGU+Ci08bGluawotICByZWw9InN0eWxlc2hlZXQiCi0gIHR5cGU9InRleHQvY3NzIgotICBocmVmPSJmb3JtYXQuY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08cCBjbGFzcz0idWViZXJzY2hyaWZ0Ij5XaGF0J3MgTmV3IGZvciAxLjU/PC9wPgotCi08cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQVBJIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgRmFjZXRlZAotUHJvamVjdCBGcmFtZXdvcmsgZm9yIFdUUCAxLjUgcmVsZWFzZS4gQm90aCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50IGNoYW5nZXMgCi1hcmUgY292ZXJlZC4gTm90ZSB0aGF0IHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIEFQSSByZW1haW5zIHByb3Zpc2lvbmFsCi1mb3IgdGhlIDEuNSByZWxlYXNlLiBUaGlzIG1lYW5zIGl0IHdpbGwgY29udGludWUgdW5kZXJnb2luZyBmdXJ0aGVyIHNpZ25pZmljYW50Ci1jaGFuZ2VzIGluIGZ1dHVyZSByZWxlYXNlKHMpLjwvcD4KLQotPHA+PGI+QXR0ZW50aW9uOjwvYj4gQWxsIEphdmEgQVBJIGFuZCBleHRlbnNpb24gcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgCi1pbiB0aGUgMS41IHJlbGVhc2Ugd2lsbCBiZSByZW1vdmVkIGluIHRoZSAyLjAgcmVsZWFzZS4gVW50aWwgdGhhdCBwb2ludCB0aGV5IAotd2lsbCBjb250aW51ZSB0byBmdW5jdGlvbiBhbmQgYmUgZnVsbHkgc3VwcG9ydGVkLjwvcD4KLQotPG9sPgotICA8bGk+PGEgaHJlZj0iI3ZleHBycyI+VmVyc2lvbiBFeHByZXNzaW9uczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2FjdGlvbnMiPkFjdGlvbiBEZWZpbml0aW9uczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3dpemFyZCI+V2l6YXJkIFBhZ2VzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjZXZlbnQuaGFuZGxlcnMiPkV2ZW50IEhhbmRsZXJzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcnVudGltZXMiPlRhcmdldGluZyBNdWx0aXBsZSBSdW50aW1lczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3ByZXNldHMiPkRlc2NyaXB0aW9ucyBmb3IgUHJlc2V0czwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI21pc2MiPk1pc2NlbGxhbmVvdXM8L2E+PC9saT4KLTwvb2w+Ci0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0idmV4cHJzIj4xLiBWZXJzaW9uIEV4cHJlc3Npb25zPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5WZXJzaW9uIGV4cHJlc3Npb25zIGFyZSB1c2VkIGluIHZhcmlvdXMgY29udGV4dCB0aHJvdWdob3V0IHRoZSBmcmFtZXdvcmsncwotZXh0ZW5zaW9uIHBvaW50cyBhbmQgSmF2YSBBUEkgd2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBuZWVkIHRvIGJlIHNwZWNpZmllZC4gSW4KLXRoZSAxLjAueCByZWxlYXNlLCB0aGUgdmVzaW9uIGV4cHJlc3Npb25zIHdlcmUgb2YgdGhlIGZvcm0gIiZsdDsxLjUsMi4zLDIuNSwmZ3Q9NS4wIiwKLXdoZXJlIGNvbW1hcyBpbmRpY2F0ZSBhIGRpc2p1bmN0aW9uIChvcikuIFRoaXMgc3ludGF4IGRpZCBub3QgYWxsb3cgcmFuZ2VzIHRvIGJlCi1zcGVjaWZpZWQgYW5kIHdhcyB1bndpZWxkeSBkdWUgdG8gdGhlIG5lZWQgdG8gZXNjYXBlIHRoZSBhbmdsZSBicmFja2V0cyBpbiB0aGUKLXBsdWdpbi54bWwgZmlsZXMuIFNvIHRoaXMgc3ludGF4IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdGhlIDEuNSByZWxlYXNlLiBUaGUgbmV3Ci1zeW50YXggYWxzbyB1c2VzIGNvbW1hcyB0byBzcGVjaWZ5IGEgZGlzanVuY3Rpb24sIGJ1dCBub3cgcmFuZ2VzIGNhbiBiZQotc3BlY2lmaWVkIHVzaW5nICJbMS4zLTYuMykiIG5vdGF0aW9uLiBTcXVhcmUgYnJhY2tldHMgbWVhbiBpbmNsdXNpdmUsIHdoaWxlCi1wYXJlbnRoZXNpcyBtZWFuIGV4Y2x1c2l2ZS4gT3BlbiByYW5nZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHVzaW5nIG5vdGF0aW9uCi1saWtlICJbMS4zIiBhbmQgIjYuMykiLjwvcD4KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJhY3Rpb25zIj4yLiBBY3Rpb24gRGVmaW5pdGlvbnM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkFjdGlvbiBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbWFkZSBpbnRvIGZpcnN0IGNsYXNzIGVudGl0aWVzIHdpdGggdGhlIG5ldwotYWJpbGl0eSB0byBiZSBhc3NpZ25lZCBhbiBpZCBhbmQgdGhlIGNyZWF0aW9uIG9mIHRoZSBicm93c2luZyBBUEkuIEluIGFkZGl0aW9uLAotaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNyZWF0ZSBjb25zdHJhaW5lZCBWRVJTSU9OX0NIQU5HRSBhY3Rpb25zIGluIG9yZGVyIHRvCi1kZXNpZ25hdGUgcHJlY2lzZWx5IHdoaWNoIHZlcnNpb25zIHRoZSBkZWxlZ2F0ZSBpcyBjYXBhYmxlIG9mIGNoYW5naW5nIGZyb20uCi1NdWx0aXBsZSBWRVJTSU9OX0NIQU5HRSBkZWxlZ2F0ZXMgd2l0aCBkaWZmZXJlbnQgImZyb20udmVyc2lvbnMiIGNvbnN0cmFpbnQKLWNhbiBiZSBzcGVjaWZpZWQuPC9wPgotCi08cD48dT5FeHRlbnNpb24gUG9pbnQgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgLi4uCi0gICZsdDthY3Rpb248L2ZvbnQ+IGlkPSJzdHJpbmciIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4gJmd0OwotICAgIC4uLgotICAgIDwvZm9udD4KLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0iZnJvbS52ZXJzaW9ucyIgdmFsdWU9InN0cmluZyIvJmd0OyA8aT4oMCBvciAxKTwvaT4KLSAgICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Ci0gICAgLi4uCi0gICZsdC9hY3Rpb24mZ3Q7Ci0gIC4uLgotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkRlZmluaXRpb24KLXsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9GUk9NX1ZFUlNJT05TOwotICAgU3RyaW5nIGdldElkKCk7Ci0gICBJUHJvamVjdEZhY2V0IGdldFByb2plY3RGYWNldCgpOwotICAgSVZlcnNpb25FeHByIGdldFZlcnNpb25FeHByKCk7Ci0gICBBY3Rpb24uVHlwZSBnZXRBY3Rpb25UeXBlKCk7Ci0gICBNYXAgZ2V0UHJvcGVydGllcygpOwotICAgT2JqZWN0IGdldFByb3BlcnR5KCBTdHJpbmcgbmFtZSApOwotICAgT2JqZWN0IGNyZWF0ZUNvbmZpZ09iamVjdCggSVByb2plY3RGYWNldFZlcnNpb24gZnYsIFN0cmluZyBwam5hbWUgKTsKLX0KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uCi17Ci0gICAuLi48L2ZvbnQ+Ci0gICBib29sZWFuIHN1cHBvcnRzKCBTZXQgYmFzZSwgQWN0aW9uLlR5cGUgdHlwZSApOwotICAgU2V0IGdldEFjdGlvbkRlZmluaXRpb25zKCk7Ci0gICBTZXQgZ2V0QWN0aW9uRGVmaW5pdGlvbnMoIEFjdGlvbi5UeXBlIHR5cGUgKTsKLSAgIElBY3Rpb25EZWZpbml0aW9uIGdldEFjdGlvbkRlZmluaXRpb24oIFNldCBiYXNlLCBBY3Rpb24uVHlwZSB0eXBlICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXIKLXsKLSAgICAuLi48L2ZvbnQ+Ci0gICAgU2V0IGdldEFjdGlvbkRlZmluaXRpb25zKCk7Ci0gICAgYm9vbGVhbiBpc0FjdGlvbkRlZmluZWQoIFN0cmluZyBpZCApOwotICAgIElBY3Rpb25EZWZpbml0aW9uIGdldEFjdGlvbkRlZmluaXRpb24oIFN0cmluZyBpZCApOwotICAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5EZXByZWNhdGVkIEphdmEgQVBJPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9I0ZGRjFDMT4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb24KLXsKLSAgIC4uLjwvZm9udD4KLSAgIGJvb2xlYW4gc3VwcG9ydHMoIEFjdGlvbi5UeXBlIHR5cGUgKTsKLSAgIE9iamVjdCBjcmVhdGVBY3Rpb25Db25maWcoIEFjdGlvbi5UeXBlIHR5cGUsIFN0cmluZyBwam5hbWUgKTsKLSAgIGJvb2xlYW4gaXNTYW1lQWN0aW9uQ29uZmlnKCBBY3Rpb24uVHlwZSB0eXBlLCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApOwotICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotfTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJ3aXphcmQiPjMuIFdpemFyZCBQYWdlczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIGV4dGVuc2lvbiBwb2ludCBzY2hlbWEgZm9yIGRlZmluaW5nIHdpemFyZCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlCi1wcm9qZWN0IGZhY2V0IGFjdGlvbnMgaGFzIGJlZW4gcmV2aXNlZCB0byBiZSBtb3JlIGZsZXhpYmxlLjwvcD4KLQotPHA+PHU+RGVwcmVjYXRlZCBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0jRkZGMUMxPgotPHByZT4KLSZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmQiJmd0OwotICAmbHQ7d2l6YXJkLXBhZ2VzIGZhY2V0PSIuLi4iJmd0OwotICAgICZsdDtpbnN0YWxsJmd0OyA8aT4oMCBvciAxKTwvaT4KLSAgICAgICZsdDtwYWdlIGNsYXNzPSIuLi4iLyZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICAgJmx0Oy9pbnN0YWxsJmd0OwotICAgICZsdDt1bmluc3RhbGwmZ3Q7IDxpPigwIG9yIDEpPC9pPgotICAgICAgJmx0O3BhZ2UgY2xhc3M9Ii4uLiIvJmd0OyA8aT4oMSBvciBtb3JlKTwvaT4KLSAgICAmbHQ7L3VuaW5zdGFsbCZndDsKLSAgJmx0Oy93aXphcmQtcGFnZXMmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PlJlcGxhY2VtZW50IEV4dGVuc2lvbiBQb2ludDwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiJmd0OwotICAmbHQ7d2l6YXJkLXBhZ2VzIGFjdGlvbj0iLi4uIiZndDsgPGk+KDEgb3IgbW9yZSk8L2k+Ci0gICAgJmx0O3BhZ2UgY2xhc3M9Ii4uLiIvJmd0OyA8aT4oMSBvciBtb3JlKTwvaT4KLSAgJmx0Oy93aXphcmQtcGFnZXMmZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPk5vdGUgdGhlIG5ldyBleHRlbnNpb24gcG9pbnQgaWQuIFRoZSAiYWN0aW9uIiBhdHRyaWJ1dGUgc2hvdWxkIGNvbnRhaW4gdGhlCi1hY3Rpb24gdGhhdCB0aGVzZSBwYWdlcyBhcmUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLiBUaGUgYWN0aW9uIGlkIGNhbgotYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgdmlhIHRoZSBuZXcgImlkIiBhdHRyaWJ1dGUgYXZhaWxhYmxlIG9uIHRoZSAiYWN0aW9uIgotZWxlbWVudCBvZiB0aGUgY29yZSBmYWNldHMgZXh0ZW5zaW9uIHBvaW50LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpZAotaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSAiW2ZhY2V0LWlkXSNbdmVyc2lvbi1leHByZXNzaW9uXSNbYWN0aW9uLXR5cGVdIiAKLXBhdHRlcm4uPC9wPgotCi08cD48dT5EZXByZWNhdGVkIEphdmEgQVBJPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNGRkYxQzEiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuUHJvamVjdEZhY2V0c1VpTWFuYWdlcgotewotICAgLi4uPC9mb250PgotICAgTGlzdCBnZXRXaXphcmRQYWdlcyggQWN0aW9uLlR5cGUgdHlwZSwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5SZXBsYWNlbWVudCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLlByb2plY3RGYWNldHNVaU1hbmFnZXIKLXsKLSAgIC4uLjwvZm9udD4KLSAgIExpc3QgZ2V0V2l6YXJkUGFnZXMoIFN0cmluZyBhY3Rpb25JZCApOwotICAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotfTwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJldmVudC5oYW5kbGVycyI+NC4gRXZlbnQgSGFuZGxlcnM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkEgbmV3IGV2ZW50IGhhbmRsaW5nIGZhY2lsaXR5IGhhcyBiZWVuIGFkZGVkLiBUaGlzIG1ha2VzIGZvciBhIGNsZWFyIHNlcGFyYXRpb24KLWJldHdlZW4gYWN0aW9ucyAodXNlciBpbml0aWF0ZWQpLCBhbmQgZXZlbnRzIChhdXRvbWF0aWMpLiBQcmlvciB0byB0aGlzIGNoYW5nZQotaXQgd2FzIHBvc3NpYmxlIHRvIHJlZ2lzdGVyIGEgInJ1bnRpbWUtY2hhbmdlZCIgYWN0aW9uLiBUaGF0IHVzYWdlIGlzIG5vdwotZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB1c2UgZXZlbnQgaGFuZGxlciBleHRlbnNpb24gcG9pbnQuIFZhcmlvdXMKLW5ldyBldmVudHMgaGF2ZSBhbHNvIGJlZW4gYWRkZWQuPC9wPgotCi08cD48dT5FdmVudCBUeXBlczwvdT48L3A+Ci0KLTxwPlBSRV9JTlNUQUxMLCBQT1NUX0lOU1RBTEwsIFBSRV9VTklOU1RBTEwsIFBPU1RfVU5JTlNUQUxMLCBQUkVfVkVSU0lPTl9DSEFOR0UsCi1QT1NUX1ZFUlNJT05fQ0hBTkdFLCBSVU5USU1FX0NIQU5HRUQ8L3A+Ci0KLTxwPjx1PkV4dGVuc2lvbiBQb2ludCBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiJmd0OwotICAuLi48L2ZvbnQ+Ci0gICZsdDtldmVudC1oYW5kbGVyIHR5cGU9Ii4uLiIgZmFjZXQ9Ii4uLiIgdmVyc2lvbj0iLi4uIiZndDsKLSAgICAmbHQ7ZGVsZWdhdGUgY2xhc3M9Ii4uLiIvJmd0OwotICAmbHQvZXZlbnQtaGFuZGxlciZndDsKLSAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPi4uLgotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5SVU5USU1FX0NIQU5HRUQgRXZlbnQ8L3U+PC9wPgotCi08cD5JbiB0aGUgMS4wLnggcmVsZWFzZSBpdCB3YXMgcG9zc2libGUgdG8gcmVnaXN0ZXIgYSAicnVudGltZS1jaGFuZ2VkIiBhY3Rpb24uCi1UaGF0IHVzYWdlIGlzIG5vdyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSBSVU5USU1FX0NIQU5HRUQKLWV2ZW50IGhhbmRsZXIuIFRoZSBSVU5USU1FX0NIQU5HRUQgZXZlbnQgaGFuZGxlciBkZWxlZ2F0ZSBnZXRzIHBhc3NlZCBpbiBhCi1jb25maWcgb2JqZWN0IHRoYXQgY2FycmllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudC48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUnVudGltZUNoYW5nZWRFdmVudAotewotICAgIElSdW50aW1lIGdldE9sZFJ1bnRpbWUoKTsKLSAgICBJUnVudGltZSBnZXROZXdSdW50aW1lKCk7Ci19ICAKLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSJydW50aW1lcyI+NS4gVGFyZ2V0aW5nIE11bHRpcGxlIFJ1bnRpbWVzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5UaGUgYWJpbGl0eSBmb3IgYSBwcm9qZWN0IHRvIHRhcmdldCBtdWx0aXBsZSBydW50aW1lcyBoYXMgYmVlbiBmdXJ0aGVyCi1mbGVzaGVkIG91dCBkdXJpbmcgdGhlIDEuNSByZWxlYXNlLjwvcD4KLSAgIAotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0gICAKLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRkZGMUMxIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0Ci17Ci0gICAuLi48L2ZvbnQ+Ci0gICBJUnVudGltZSBnZXRSdW50aW1lKCk7Ci0gICB2b2lkIHNldFJ1bnRpbWUoIElSdW50aW1lIHJ1bnRpbWUgKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotICAgICAKLTxwPjx1PlJlcGxhY2VtZW50IEphdmEgQVBJPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QKLXsKLSAgIC4uLjwvZm9udD4KLSAgIFNldCBnZXRUYXJnZXRlZFJ1bnRpbWVzKCk7Ci0gICB2b2lkIHNldFRhcmdldGVkUnVudGltZXMoIFNldCBydW50aW1lcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICk7Ci0gICB2b2lkIGFkZFRhcmdldGVkUnVudGltZSggSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICk7Ci0gICB2b2lkIHJlbW92ZVRhcmdldGVkUnVudGltZSggSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICk7Ci0gICBJUnVudGltZSBnZXRQcmltYXJ5UnVudGltZSgpOwotICAgdm9pZCBzZXRQcmltYXJ5UnVudGltZSggSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICk7Ci0gICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi19PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InByZXNldHMiPjYuIERlc2NyaXB0aW9ucyBmb3IgUHJlc2V0czwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+SXQgaXMgbm93IHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBkZXNjcmlwdGlvbiB3aXRoIHByZXNldHMuPC9wPgotICAgCi08cD48dT5FeHRlbnNpb24gUG9pbnRzIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gIC4uLgotICAmbHQ7cHJlc2V0Jmd0OwotICAgIC4uLjwvZm9udD4KLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Li4uJmx0L2Rlc2NyaXB0aW9uJmd0OyA8aT4oMCBvciAxKTwvaT4KLSAgICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Li4uCi0gICZsdC9wcmVzZXQmZ3Q7Ci0gIC4uLgotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5KYXZhIEFQSSBDaGFuZ2VzPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcgotewotICAgLi4uPC9mb250PgotICAgSVByZXNldCBkZWZpbmVQcmVzZXQoIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIFNldCBmYWNldHMgKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci0KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0Ci17Ci0gICAuLi48L2ZvbnQ+Ci0gICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0ibWlzYyI+Ny4gTWlzY2VsbGFuZW91czwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+PHU+SmF2YSBBUEkgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb24KLXsKLSAgIC4uLjwvZm9udD4KLSAgIGJvb2xlYW4gaXNWYWxpZEZvciggU2V0IGZpeGVkICk7Ci0gICBib29sZWFuIGNvbmZsaWN0c1dpdGgoIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICk7Ci0gICBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLSAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4uLi4KLX08L2ZvbnQ+Ci0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcgotewotICAgYm9vbGVhbiBldmFsdWF0ZSggU3RyaW5nIHZlcnNpb24gKTsKLSAgIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmcoKTsKLX0KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzE1MS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzE1MS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQzZDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcxNTEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YQotICBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCi0gIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5XaGF0J3MgTmV3IGZvciAxLjUuMT88L3RpdGxlPgotPGxpbmsKLSAgcmVsPSJzdHlsZXNoZWV0IgotICB0eXBlPSJ0ZXh0L2NzcyIKLSAgaHJlZj0iZm9ybWF0LmNzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHAgY2xhc3M9InVlYmVyc2NocmlmdCI+V2hhdCdzIE5ldyBmb3IgMS41LjE/PC9wPgotCi08cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQVBJIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgRmFjZXRlZAotUHJvamVjdCBGcmFtZXdvcmsgZm9yIFdUUCAxLjUuMSByZWxlYXNlLiBCb3RoIEphdmEgQVBJIGFuZCBleHRlbnNpb24gcG9pbnQgCi1jaGFuZ2VzIGFyZSBjb3ZlcmVkLiBOb3RlIHRoYXQgdGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgQVBJIHJlbWFpbnMgCi1wcm92aXNpb25hbCBmb3IgdGhlIDEuNS4xIHJlbGVhc2UuIFRoaXMgbWVhbnMgaXQgd2lsbCBjb250aW51ZSB1bmRlcmdvaW5nIAotZnVydGhlciBzaWduaWZpY2FudCBjaGFuZ2VzIGluIGZ1dHVyZSByZWxlYXNlKHMpLjwvcD4KLQotPG9sPgotICA8bGk+PGEgaHJlZj0iI2RlZnZlciI+U3BlY2lmeWluZyBEZWZhdWx0IEZhY2V0IFZlcnNpb248L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiN3aWxkY2FyZCI+V2lsZGNhcmQgU3VwcG9ydCBpbiBWZXJzaW9uIEV4cHJlc3Npb25zPC9hPjwvbGk+Ci08L29sPgotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InZleHBycyI+MS4gU3BlY2lmeWluZyBEZWZhdWx0IEZhY2V0IFZlcnNpb248L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkl0IGlzIG5vdyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBmYWNldCB2ZXJzaW9uIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQKLXdoZW4gdGhlIGZhY2V0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlci4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQKLXZlcnNpb24uIFlvdSBjYW4gZWl0aGVyIHNwZWNpZnkgYSBzdGF0aWMgZGVmYXVsdCBvciB5b3UgY2FuIGltcGxlbWVudCB0aGUKLTxjb2RlPklEZWZhdWx0VmVyc2lvblByb3ZpZGVyPC9jb2RlPiBpbnRlcmZhY2UuIElmIGEgZGVmYXVsdCB2ZXJzaW9uIGlzIG5vdAotc3BlY2lmaWVkLCB0aGUgbGF0ZXN0IHZlcnNpb24gd2lsbCBiZSB1c2VkIGluc3RlYWQuPC9wPgotCi08cD48dT5FeHRlbnNpb24gUG9pbnQgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDsKLSAgJmx0O3Byb2plY3QtZmFjZXQmZ3Q7PC9mb250PgotICAgICZsdDtkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0ie3N0cmluZ30iLyZndDsgPGk+KG9wdGlvbmFsKTwvaT4KLSAgICAmbHQ7ZGVmYXVsdC12ZXJzaW9uIHByb3ZpZGVyPSJ7Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlZmF1bHRWZXJzaW9uUHJvdmlkZXJ9Ii8mZ3Q7IDxpPihvcHRpb25hbCk8L2k+Ci0gIDxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7L3Byb2plY3QtZmFjZXQmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1PkphdmEgQVBJIEFkZGl0aW9uczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldAotezwvZm9udD4KLSAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRWZXJzaW9uKCk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLXsKLSAgIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRWZXJzaW9uKCk7Ci19Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9IndpbGRjYXJkIj4yLiBXaWxkY2FyZCBTdXBwb3J0IGluIFZlcnNpb24gRXhwcmVzc2lvbnM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkEgd2lsZGNhcmQgY2hhcmFjdGVyICcqJyBjYW4gbm93IGJlIHVzZWQgaW4gdmVyc2lvbiBleHByZXNzaW9ucyBpbiBvcmRlciB0bwotbWF0Y2ggYW55IHZlcnNpb24uIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHRoZSB3aWxkY2FyZCB0byBtYXRjaAotcGFydCBvZiB0aGUgdmVyc2lvbiBzdHJpbmcuPC9wPgotCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklWZXJzaW9uRXhwcgotezwvZm9udD4KLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lMRENBUkRfU1lNQk9MID0gIioiOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXcyMC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzIwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZjVmMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzIwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhCi0gIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLSAgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPldoYXQncyBOZXcgZm9yIDIuMD88L3RpdGxlPgotPGxpbmsKLSAgcmVsPSJzdHlsZXNoZWV0IgotICB0eXBlPSJ0ZXh0L2NzcyIKLSAgaHJlZj0iZm9ybWF0LmNzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHAgY2xhc3M9InVlYmVyc2NocmlmdCI+V2hhdCdzIE5ldyBmb3IgMi4wPzwvcD4KLQotPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEFQSSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgZm9yIAotdGhlIFdUUCAyLjAgcmVsZWFzZS4gQm90aCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50IGNoYW5nZXMgYXJlIGNvdmVyZWQuIEFsbCBBUEkgdGhhdCB3YXMgCi1kZXByZWNhdGVkIGluIHRoaXMgcmVsZWFzZSBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBjbGllbnRzIGFyZSBhZHZpc2VkIHRvIHN3aXRjaCB0byBub24tZGVwcmVjYXRlZCAKLWFsdGVybmF0aXZlcyBhcyBzb29uIGFzIGZlYXNpYmxlLjwvcD4KLQotPG9sPgotICA8bGk+PGEgaHJlZj0iI2dlbmVyaWNzIj5HZW5lcmljczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3ByZXNldHMiPkltcHJvdmVtZW50cyB0byBQcmVzZXRzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjY29tcGFyYWJsZSI+SVByb2plY3RGYWNldFZlcnNpb24gYW5kIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBFeHRlbmQgQ29tcGFyYWJsZTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3JlcXVpcmVzLWdyb3VwIj5SZXF1aXJlcyBDb25zdHJhaW50IFN1cHBvcnRzIEdyb3VwczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2dyb3VwLWxhYmVscyI+TGFiZWxzIGFuZCBEZXNjcmlwdGlvbnMgZm9yIEdyb3VwczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3ZhbGlkYXRlIj5OZXcgSUZhY2V0ZWRQcm9qZWN0IFZhbGlkYXRpb24gQVBJPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjbmV3LXdpemFyZC1jbGFzcyI+QWRkUmVtb3ZlRmFjZXRzV2l6YXJkIENsYXNzIFJlbmFtZWQgdG8gTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQ8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNwZGUtbGltaXRhdGlvbnMiPkV4dGVuc2lvbiBQb2ludCBTY2hlbWEgQ2hhbmdlcyB0byBXb3JrIEFyb3VuZCBQREUgTGltaXRhdGlvbnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNsaXN0ZW5lcnMiPkxpc3RlbmVycyBhbmQgRXZlbnRzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjbWlzYyI+TWlzY2VsbGFuZW91czwvYT48L2xpPgotPC9vbD4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9IiNnZW5lcmljcyI+MS4gR2VuZXJpY3M8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkFsbCBvZiB0aGUgZnJhbWV3b3JrJ3MgQVBJIG5vdyB1c2UgSmF2YSA1IGdlbmVyaWNzLiBUaGlzIGhhcyBiZWVuIGRvbmUgaW4gYSBiYWNrd2FyZHMgY29tcGF0aWJsZQotd2F5IGFuZCBleGlzdGluZyBjbGllbnRzIGFyZSBleHBlY3RlZCB0byBjb250aW51ZSB0byB3b3JrIHdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbnMuIEluIG9yZGVyIGZvciBhIAotY2xpZW50IHRvIGdhaW4gYWNjZXNzIHRvIHRoZSB0eXBlIHNhZmV0eSBhZmZvcmRlZCBieSBnZW5lcmljcyBpbiB0aGlzIEFQSSwgdGhlIGNsaWVudCBwbHVnaW4ncyBKYXZhIAotY29tcGlsZXIgbGV2ZWwgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gYmUgNS4wIG9yIG5ld2VyLjwvcD4gIAotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0icHJlc2V0cyI+Mi4gSW1wcm92ZW1lbnRzIHRvIFByZXNldHM8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlNpZ25pZmljYW50IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgcHJlc2V0cyBmYWNpbGl0eSBmb3IgdGhlIDIuMCByZWxlYXNlLiBBIG5ldyB0eXBlIG9mCi1wcmVzZXQsIHJlZmVycmVkIHRvIGFzIGEgZHluYW1pYyBwcmVzZXQsIGlzIG5vdyBhdmFpbGFibGUuIEEgZHluYW1pYyBwcmVzZXQgdXNlcyBhbiBleHRlbmRlci1zdXBwbGllZAotZmFjdG9yeSB0byBzeW50aGVzaXplIHRoZSBwcmVzZXQgZGVmaW5pdGlvbiBvbiB0aGUgZmx5IGJhc2VkIG9uIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IHdpbGwgYmUKLXVzZWQuIFRoZSAib2xkLXN0eWxlIiBkZWNsYXJhdGl2ZSBwcmVzZXRzIGFyZSBzdGlsbCBhdmFpbGFibGUgYW5kIGFyZSBub3cgcmVmZXJyZWQgdG8gYXMgc3RhdGljCi1wcmVzZXRzLiBTdGF0aWMgcHJlc2V0cyBoYXZlIGFsc28gYmVlbiBpbXByb3ZlZCB0byBhbGxvdyB0aGVtIHRvIGV4dGVuZCBvdGhlciBwcmVzZXRzLiBBIHN0YXRpYwotcHJlc2V0IGNhbiBldmVuIGV4dGVuZCBhIGR5bmFtaWMgcHJlc2V0LjwvcD4KLQotPHA+VGhlcmUgaXMgYWxzbyBhIG5ldyBwcmVzZXQgdGhhdCdzIHBhcnQgb2YgdGhlIGZyYW1ld29yay4gSXQncyBhIGR5bmFtaWMgcHJlc2V0IHdpdGggaWQgb2YgCi0iZGVmYXVsdC5jb25maWd1cmF0aW9uIiBhbmQgd2hvc2UgY29udGVudHMgYXJlIHN5bnRoZXNpemVkIGFzIGZvbGxvd3M6PC9wPgotCi08b2w+Ci0gIDxsaT5JZiBhIHJ1bnRpbWUgaXMgc2VsZWN0ZWQsIHRoaXMgcHJlc2V0IHdpbGwgY29udGFpbiBkZWZhdWx0IGZhY2V0cyBhcyBzcGVjaWZpZWQgYnkKLSAgICBJUnVudGltZS5nZXREZWZhdWx0RmFjZXRzKFNldCkuPC9saT4KLSAgPGxpPklmIG5vIHJ1bnRpbWUgaXMgc2VsZWN0ZWQsIHRoaXMgcHJlc2V0IHdpbGwgY29udGFpbiBkZWZhdWx0IHZlcnNpb25zIGZvciBhbGwgb2YgdGhlIGZpeGVkCi0gICAgZmFjZXRzIGFzIHNwZWNpZmllZCBieSBJUHJvamVjdEZhY2V0LmdldERlZmF1bHRWZXJzaW9uKCkuPC9saT4KLTwvb2w+ICAgCi0KLTxwPjx1Pk5ldyBFeHRlbnNpb24gUG9pbnQ8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotJmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0cyImZ3Q7Ci0gICZsdDtzdGF0aWMtcHJlc2V0IGlkPSI8aT57c3RyaW5nfTwvaT4iIGV4dGVuZHM9IjxpPntzdHJpbmd9PC9pPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxpPntzdHJpbmd9PC9pPiZsdDsvbGFiZWwmZ3Q7IDxpPihvcHRpb25hbCk8L2k+Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxpPntzdHJpbmd9PC9pPiZsdDsvZGVzY3JpcHRpb24mZ3Q7IDxpPihvcHRpb25hbCk8L2k+Ci0gICAgJmx0O2ZhY2V0IGlkPSI8aT57c3RyaW5nfTwvaT4iIHZlcnNpb249IjxpPntzdHJpbmd9PC9pPiIvJmd0OyA8aT4oMSBvciBtb3JlKTwvaT4KLSAgJmx0Oy9zdGF0aWMtcHJlc2V0Jmd0OyA8aT4oMCBvciBtb3JlKTwvaT4KLSAgJmx0O2R5bmFtaWMtcHJlc2V0IGlkPSI8aT57c3RyaW5nfTwvaT4iJmd0OwotICAgICZsdDtmYWN0b3J5IGNsYXNzPSI8aT57Y2xhc3M6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldEZhY3Rvcnl9PC9pPiIvJmd0OwotICAmbHQ7L2R5bmFtaWMtcHJlc2V0Jmd0OyA8aT4oMCBvciBtb3JlKTwvaT4KLSZsdDtleHRlbnNpb24mZ3Q7Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5EZXByZWNhdGVkIEV4dGVuc2lvbiBQb2ludDwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRkZGMUMxIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L2ZvbnQ+Ci0gICZsdDtwcmVzZXQgaWQ9IjxpPntzdHJpbmd9PC9pPiImZ3Q7Ci0gICAgJmx0O2xhYmVsJmd0OzxpPntzdHJpbmd9PC9pPiZsdDsvbGFiZWwmZ3Q7IDxpPihvcHRpb25hbCk8L2k+Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OzxpPntzdHJpbmd9PC9pPiZsdDsvZGVzY3JpcHRpb24mZ3Q7IDxpPihvcHRpb25hbCk8L2k+Ci0gICAgJmx0O2ZhY2V0IGlkPSI8aT57c3RyaW5nfTwvaT4iIHZlcnNpb249IjxpPntzdHJpbmd9PC9pPiIvJmd0OyA8aT4oMSBvciBtb3JlKTwvaT4KLSAgJmx0Oy9wcmVzZXQmZ3Q7IDxpPigwIG9yIG1vcmUpPC9pPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+SmF2YSBBUEkgQWRkaXRpb25zPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5pbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByZXNldAotezwvZm9udD4KLSAgICBlbnVtIFR5cGUgeyBTVEFUSUMsIERZTkFNSUMsIFVTRVJfREVGSU5FRCB9Ci0gICAgVHlwZSBnZXRUeXBlKCk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLQotaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEeW5hbWljUHJlc2V0IGV4dGVuZHMgSVByZXNldAotewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9LRVlfRklYRURfRkFDRVRTOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9LRVlfUFJJTUFSWV9SVU5USU1FOwotICAgIElQcmVzZXQgcmVzb2x2ZSggTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgKTsKLX0KLQotaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXRGYWN0b3J5Ci17Ci0gICAgUHJlc2V0RGVmaW5pdGlvbiBjcmVhdGVQcmVzZXQoIFN0cmluZyBwcmVzZXRJZCwgTWFwPFN0cmluZyxPYmplY3Q+IGNvbnRleHQgKTsKLX0KLQotY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJlc2V0RGVmaW5pdGlvbgotewotICAgIFByZXNldERlZmluaXRpb24oIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyApOwotICAgIFN0cmluZyBnZXRMYWJlbCgpOwotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICAgIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0UHJvamVjdEZhY2V0cygpOwotfQotCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcmsKLXs8L2ZvbnQ+Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTkZJR1VSQVRJT05fUFJFU0VUX0lEOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5EZXByZWNhdGVkIEphdmEgQVBJPC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9I0ZGRjFDMT4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+aW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXQKLXs8L2ZvbnQ+Ci0gICAgYm9vbGVhbiBpc1VzZXJEZWZpbmVkKCkKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9IiNjb21wYXJhYmxlIj4zLiBJUHJvamVjdEZhY2V0VmVyc2lvbiBhbmQgSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIEV4dGVuZCBDb21wYXJhYmxlPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5UaGUgSVByb2plY3RGYWNldFZlcnNpb24gYW5kIElSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBpbnRlcmZhY2VzIG5vdyBleHRlbmQKLUNvbXBhcmFibGUuIFVzaW5nIHRoZSBjb21wYXJlVG8gbWV0aG9kcyB3aWxsIHlpZWxkIHNpZ25pZmljYW50bHkgYmV0dGVyIHBlcmZvcm1hbmNlCi10aGFuIGNhbGxpbmcgdGhlIHZlcnNpb24gY29tcGFyYXRvciBkaXJlY3RseSBvbiB0aGUgdmVyc2lvbiBzdHJpbmdzIGFzIHRoZSAKLWNvbXBhcmVUbyBtZXRob2RzIHVzZSBwcmUtY29tcHV0ZWQgcmVzdWx0cyBhbmQgZG8gbm90IG5lZWQgdG8gcGFyc2UgdGhlIHZlcnNpb24KLXN0cmluZ3MuPC9wPgotCi08cD5BcyBwYXJ0IG9mIHRoaXMgY2hhbmdlLCBJVmVyc2lvbkV4cHIuZXZhbHVhdGUoIFN0cmluZyApIG1ldGhvZCBoYXMgYmVlbgotcmVwbGFjZWQgd2l0aCBJVmVyc2lvbkV4cHIuY2hlY2soIENvbXBhcmFibGUgKSBtZXRob2QuPC9wPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0iI3JlcXVpcmVzLWdyb3VwIj40LiBSZXF1aXJlcyBDb25zdHJhaW50IFN1cHBvcnRzIEdyb3VwczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIHJlcXVpcmVzIGNvbnN0cmFpbnQgY2FuIG5vdyBiZSBkZWNsYXJlZCB1c2luZyBmYWNldCBncm91cHMgaW5zdGVhZCBvZgotaW5kaXZpZHVhbCBmYWNldHMuIEFueSBtZW1iZXIgb2YgdGhlIGdyb3VwIHdpbGwgc2F0aXNmeSB0aGUgY29uc3RyYWludC4gVGhpcwotYWxsb3dzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gc28gdGhhdCBhIGZhY2V0IGRvZXMgbm90IG5lZWQgdG8ga25vdyBhYm91dCBhbGwgb2YKLXRoZSBncm91cCBtZW1iZXJzLjwvcD4KLQotPHA+PHU+RXh0ZW5zaW9uIFBvaW50IENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0LXZlcnNpb24mZ3Q7Ci0gICAgJmx0O2NvbnN0cmFpbnQmZ3Q7PC9mb250PgotICAgICAgJmx0O3JlcXVpcmVzIGdyb3VwPSJncm91cC5pZCIvJmd0OwotICAgIDxmb250IGNvbG9yPSIjN0I3QjdCIj4mbHQ7L2NvbnN0cmFpbnQmZ3Q7Ci0gICZsdDsvcHJvamVjdC1mYWNldC12ZXJzaW9uJmd0OwotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0iZ3JvdXAtbGFiZWxzIj41LiBMYWJlbHMgYW5kIERlc2NyaXB0aW9ucyBmb3IgR3JvdXBzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5JdCBpcyBub3cgcG9zc2libGUgdG8gYXNzb2NpYXRlIGxhYmVscyBhbmQgZGVzY3JpcHRpb24gd2l0aCBncm91cHMuIE5vdGUgdGhhdAotZ3JvdXBzIGFyZSBzdGlsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgb24gZmlyc3QgdXNlLCBzbyB0aGUgdXNlIG9mIHRoZSBuZXcgZ3JvdXAKLWVsZW1lbnQgaXMgb25seSBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgbGFiZWwgYW5kIHRoZSBkZXNjcmlwdGlvbi48L3A+Ci0gICAKLTxwPjx1PkV4dGVuc2lvbiBQb2ludHMgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L2ZvbnQ+Ci0gICZsdDtncm91cCBpZD0iLi4uIiZndDsgPGk+KDAgb3IgbW9yZSk8L2k+Ci0gICAgJmx0O2xhYmVsJmd0Oy4uLiZsdC9sYWJlbCZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Li4uJmx0L2Rlc2NyaXB0aW9uJmd0OyA8aT4oMCBvciAxKTwvaT4KLSAgJmx0L2dyb3VwJmd0OwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+SmF2YSBBUEkgQ2hhbmdlczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUdyb3VwCi17PC9mb250PgotICAgU3RyaW5nIGdldExhYmVsKCk7Ci0gICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InZhbGlkYXRlIj42LiBOZXcgSUZhY2V0ZWRQcm9qZWN0IFZhbGlkYXRpb24gQVBJPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5UaGVyZSBpcyBub3cgQVBJIGZvciB2YWxpZGF0aW5nIHRoZSBmYWNldGVkIHByb2plY3QuIEl0IGFsbG93cyB0aGUgY2FsbGVyIHRvCi1maW5kIG91dCBhYm91dCBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCB3aXRob3V0IHNlYXJjaGluZyBmb3IgcHJvYmxlbQotbWFya2VycyBjcmVhdGVkIGJ5IHRoZSBmYWNldGVkIHByb2plY3QgdmFsaWRhdGlvbiBidWlsZGVyLiBUaGUgdmFsaWRhdGlvbgotYnVpbGRlciBub3cgdXNlcyB0aGUgbmV3IEFQSS48L3A+Ci0KLTxwPjx1PkphdmEgQVBJIENoYW5nZXM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdAotezwvZm9udD4KLSAgIElTdGF0dXMgdmFsaWRhdGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0ibmV3LXdpemFyZC1jbGFzcyI+Ny4gQWRkUmVtb3ZlRmFjZXRzV2l6YXJkIENsYXNzIFJlbmFtZWQgdG8gTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQ8L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPlRoZSBBZGRSZW1vdmVGYWNldHNXaXphcmQgY2xhc3MgaGFzIGJlZW4gcmVuYW1lZCB0byBNb2RpZnlGYWNldGVkUHJvamVjdFdpemFyZAotdG8gYWxpZ24gd2l0aCB0ZXJtaW5vbG9neSBjaGFuZ2UgYmVpbmcgbWFkZSBpbiB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLiBUaGUgb2xkCi1jbGFzcyBpcyBkZXByZWNhdGVkLCBidXQgc3RpbGwgc3VwcG9ydGVkIChleHRlbmRzIHRoZSBuZXcgY2xhc3MpLjwvcD4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9InBkZS1saW1pdGF0aW9ucyI+OC4gRXh0ZW5zaW9uIFBvaW50IFNjaGVtYSBDaGFuZ2VzIHRvIFdvcmsgQXJvdW5kIFBERSBMaW1pdGF0aW9uczwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+SW4gb3JkZXIgdG8gd29yayBhcm91bmQgZmFsc2Ugd2FybmluZ3MgcmVwb3J0ZWQgYnkgUERFJ3MgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSB2YWxpZGF0aW9uLCB0aGUKLWZvbGxvd2luZyBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBmcmFtZXdvcmsncyBleHRlbnNpb24gcG9pbnRzLiBUaGUgb2xkIHN5bnRheCBpcyBkZXByZWNhdGVkLAotYnV0IGlzIHN0aWxsIHN1cHBvcnRlZC48L3A+Ci0KLTxwPldoZW4gZGVjbGFyaW5nIHRoYXQgYSBmYWNldCBiZWxvbmdzIHRvIGEgY2F0ZWdvcnkuLi48L3A+Ci0KLTxwPjx1Pk9sZCBTeW50YXg8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0Jmd0OzwvZm9udD4KLSAgICAmbHQ7Y2F0ZWdvcnkmZ3Q7Li4uJmx0L2NhdGVnb3J5Jmd0OwotICA8Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0L3Byb2plY3QtZmFjZXQmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLTxwPjx1Pk5ldyBTeW50YXg8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyImZ3Q7Ci0gICZsdDtwcm9qZWN0LWZhY2V0Jmd0OzwvZm9udD4KLSAgICAmbHQ7bWVtYmVyIGNhdGVnb3J5PSIuLi4iLyZndDsKLSAgPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdC9wcm9qZWN0LWZhY2V0Jmd0OwotJmx0O2V4dGVuc2lvbiZndDs8L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08cD48Zm9udCBzaXplPSIrMSI+PGEgbmFtZT0ibGlzdGVuZXJzIj45LiBMaXN0ZW5lcnMgYW5kIEV2ZW50czwvYT48L2ZvbnQ+PC9wPgotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHA+VGhlIGV4aXN0aW5nIGZhY2lsaXRpZXMgZm9yIGxpc3RlbmluZyBvbiBmYWNldGVkIHByb2plY3QgbW9kZWwgY2hhbmdlcyBoYXZlIGJlZW4gcmUtZGVzaWduZWQgdG8KLXByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlIHRoYXQgdG9vayBwbGFjZSBhbmQgdG8gcHJvdmlkZSB0aGUgc2FtZSBmYWNpbGl0eQotcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjbGllbnQgY2hvb3NlcyB0byByZWdpc3RlciB0aGUgbGlzdGVuZXIgdmlhIGRpcmVjdCBBUEkgY2FsbCBvciB2aWEgYW4KLWV4dGVuc2lvbiBwb2ludC48L3A+Ci0KLTxwPkluIDEuNSwgZXh0ZW5kZXJzIGNvdWxkIGVpdGhlcjo8L3A+Ci0KLTxvbD4KLSAgCi0gIDxsaT5Vc2UgPGNvZGU+SUZhY2V0ZWRQcm9qZWN0LmFkZExpc3RlbmVyKCk8L2NvZGU+IG1ldGhvZC4gTGlzdGVuZXIgd291bGQgZ2V0IGNhbGxlZCB3aGVuIGFueQotICBhc3BlY3Qgb2YgZmFjZXRlZCBwcm9qZWN0IG1vZGVsIHdhcyBjaGFuZ2VkLCBidXQgdGhlIGxpc3RlbmVyIHdhcyBub3QgZ2l2ZW4gYW55IGRldGFpbHMgYWJvdXQKLSAgdGhlIGNoYW5nZSB0aGF0IHRvb2sgcGxhY2UuPGJyLz48YnIvPjwvbGk+Ci0gIAotICA8bGk+VXNlIDxjb2RlPiZsdDtldmVudC1oYW5kbGVyJmd0OzwvY29kZT4gZWxlbWVudCBvZiB0aGUgCi0gIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IHRvIHJlZ2lzdGVyIGFuCi0gIDxjb2RlPklEZWxlZ2F0ZTwvY29kZT4gaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgc2ltaWxhciB0byBob3cgYWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQuIFRoaXMgCi0gIGFwcHJvYWNoIGdhdmUgdXNlciBhIGJpdCBtb3JlIGNvbnRyb2wgb3ZlciB3aGF0IGV2ZW50cyB0byBwcm9jZXNzIGFzIHdlbGwgYXMgbW9yZSBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgd2hhdCBhY3R1YWxseSB0b29rIHBsYWNlLiBIb3dldmVyLCBub3QgYWxsIGNoYW5nZXMgY291bGQgYmUgc3VyZmFjZWQgdmlhIHRoaXMgCi0gIGludGVyZmFjZSBkdWUgdG8gbGltaXRhdGlvbnMgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCBhbmQgdGhlIDxjb2RlPklEZWxlZ2F0ZTwvY29kZT4gaW50ZXJmYWNlLjwvbGk+Ci0gIAotPC9vbD4KLQotPHA+RnVsbCBkaXNjdXNzaW9uIG9mIHRoZSBuZXcgZmFjaWxpdHkgY2FuIGJlIGZvdW5kIDxhIGhyZWY9Imxpc3RlbmVycy5odG1sIj5oZXJlPC9hPi48L3A+Ci0gICAKLTxwPjx1PkphdmEgQVBJIEFkZGl0aW9uczwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRTJFMkUyIj4KLTxwcmU+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLXsKLSAgICB2b2lkIGhhbmRsZUV2ZW50KCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApOwotfQotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLXsKLSAgICBlbnVtIFR5cGUKLSAgICB7Ci0gICAgICAgIFBST0pFQ1RfTU9ESUZJRUQsCi0gICAgICAgIFBSRV9JTlNUQUxMLAotICAgICAgICBQT1NUX0lOU1RBTEwsCi0gICAgICAgIFBSRV9VTklOU1RBTEwsCi0gICAgICAgIFBPU1RfVU5JTlNUQUxMLAotICAgICAgICBQUkVfVkVSU0lPTl9DSEFOR0UsCi0gICAgICAgIFBPU1RfVkVSU0lPTl9DSEFOR0UsCi0gICAgICAgIEZJWEVEX0ZBQ0VUU19DSEFOR0VELAotICAgICAgICBUQVJHRVRFRF9SVU5USU1FU19DSEFOR0VELAotICAgICAgICBQUklNQVJZX1JVTlRJTUVfQ0hBTkdFRAotICAgIH0KLSAgICAKLSAgICBUeXBlIGdldFR5cGUoKTsKLSAgICBJRmFjZXRlZFByb2plY3QgZ2V0UHJvamVjdCgpOwotfQotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZpeGVkRmFjZXRzQ2hhbmdlZEV2ZW50IDogSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLXsKLSAgICBTZXQmbHQ7SVByb2plY3RGYWNldCZndDsgZ2V0T2xkRml4ZWRGYWNldHMoKTsKLSAgICBTZXQmbHQ7SVByb2plY3RGYWNldCZndDsgZ2V0TmV3Rml4ZWRGYWNldHMoKTsKLX0KLQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCA6IElGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgSVByb2plY3RGYWNldCBnZXRQcm9qZWN0RmFjZXQoKTsKLSAgICBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0gICAgT2JqZWN0IGdldEFjdGlvbkNvbmZpZygpOwotfQotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByaW1hcnlSdW50aW1lQ2hhbmdlZEV2ZW50IDogSUZhY2V0ZWRQcm9qZWN0RXZlbnQKLXsKLSAgICBJUnVudGltZSBnZXRPbGRQcmltYXJ5UnVudGltZSgpOwotICAgIElSdW50aW1lIGdldE5ld1ByaW1hcnlSdW50aW1lKCk7Ci19Ci0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JVGFyZ2V0ZWRSdW50aW1lc0NoYW5nZWRFdmVudCA6IElGYWNldGVkUHJvamVjdEV2ZW50Ci17Ci0gICAgU2V0Jmx0O0lSdW50aW1lJmd0OyBnZXRPbGRUYXJnZXRlZFJ1bnRpbWVzKCk7Ci0gICAgU2V0Jmx0O0lSdW50aW1lJmd0OyBnZXROZXdUYXJnZXRlZFJ1bnRpbWVzKCk7Ci19Ci0KLTxmb250IGNvbG9yPSIjN0I3QjdCIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QKLXs8L2ZvbnQ+Ci0gICAgdm9pZCBhZGRMaXN0ZW5lciggb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLi4uICk7Ci0gICAgdm9pZCByZW1vdmVMaXN0ZW5lciggb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyICk7Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+fTwvZm9udD4KLQotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrCi17PC9mb250PgotICAgIHZvaWQgYWRkTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS4uLiApOwotICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lciApOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5OZXcgRXh0ZW5zaW9uIFBvaW50PC91PjwvcD4KLQotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCI+PHRyPjx0ZCB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+PHRkIGJnY29sb3I9IiNFMkUyRTIiPgotPHByZT4KLSZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVycyImZ3Q7Ci0gICZsdDtsaXN0ZW5lciAKLSAgICBjbGFzcz0ie2NsYXNzOm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcn0iCi0gICAgZXZlbnRUeXBlcz0ie2NzdjpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZX0iLz4gPGk+KDEgb3IgbW9yZSk8L2k+Ci0mbHQ7ZXh0ZW5zaW9uJmd0OwotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotPHA+PHU+RGVwcmVjYXRlZCBKYXZhIEFQSTwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSNGRkYxQzE+Ci08cHJlPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLXsKLSAgICBwcm9qZWN0Q2hhbmdlZCgpOwotfQotCi08Zm9udCBjb2xvcj0iIzdCN0I3QiI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0Ci17PC9mb250PgotICAgIHZvaWQgYWRkTGlzdGVuZXIoIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdExpc3RlbmVyICk7Ci0gICAgdm9pZCByZW1vdmVMaXN0ZW5lciggb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgKTsKLTxmb250IGNvbG9yPSIjN0I3QjdCIj59PC9mb250PgotCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUnVudGltZUNoYW5nZWRFdmVudAotewotICAgIElSdW50aW1lIGdldE9sZFJ1bnRpbWUoKTsKLSAgICBJUnVudGltZSBnZXROZXdSdW50aW1lKCk7Ci19Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi08cD48dT5EZXByZWNhdGVkIEV4dGVuc2lvbiBQb2ludDwvdT48L3A+Ci0KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiPjx0cj48dGQgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPjx0ZCBiZ2NvbG9yPSIjRkZGMUMxIj4KLTxwcmU+Ci08Zm9udCBjb2xvcj0iIzdCN0I3QiI+Jmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIiZndDs8L2ZvbnQ+Ci0gICZsdDtldmVudC1oYW5kbGVyIHR5cGU9IntzdHJpbmd9IiBmYWNldD0ie3N0cmluZ30iIHZlcnNpb249IntzdHJpbmd9IiZndDsKLSAgICAmbHQ7ZGVsZWdhdGUgY2xhc3M9IntjbGFzczpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGV9Ii8mZ3Q7Ci0gICZsdC9ldmVudC1oYW5kbGVyJmd0OwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPiZsdDtleHRlbnNpb24mZ3Q7PC9mb250PgotPC9wcmU+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9Im1pc2MiPjEwLiBNaXNjZWxsYW5lb3VzPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotPGZvbnQgY29sb3I9IiM3QjdCN0IiPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdAotezwvZm9udD4KLSAgICBib29sZWFuIGlzVGFyZ2V0YWJsZSggSVJ1bnRpbWUgcnVudGltZSApOwotICAgIGJvb2xlYW4gaXNUYXJnZXRlZCggSVJ1bnRpbWUgcnVudGltZSApOwotPGZvbnQgY29sb3I9IiM3QjdCN0IiPn08L2ZvbnQ+Ci08L3ByZT4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXczMDEuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvZ3VpZGUvd2hhdHNuZXczMDEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhN2M4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MzAxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEKLSAgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+V2hhdCdzIE5ldyBmb3IgMi4wPzwvdGl0bGU+Ci08bGluawotICByZWw9InN0eWxlc2hlZXQiCi0gIHR5cGU9InRleHQvY3NzIgotICBocmVmPSJmb3JtYXQuY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08cCBjbGFzcz0idWViZXJzY2hyaWZ0Ij5XaGF0J3MgTmV3IGZvciAzLjAuMT88L3A+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBBUEkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIHRoZSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIGZvciAKLXRoZSBXVFAgMy4wLjEgcmVsZWFzZS4gQm90aCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50IGNoYW5nZXMgYXJlIGNvdmVyZWQuIEFsbCBBUEkgdGhhdCB3YXMgCi1kZXByZWNhdGVkIGluIHRoaXMgcmVsZWFzZSBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBjbGllbnRzIGFyZSBhZHZpc2VkIHRvIHN3aXRjaCB0byBub24tZGVwcmVjYXRlZCAKLWFsdGVybmF0aXZlcyBhcyBzb29uIGFzIGZlYXNpYmxlLjwvcD4KLQotPG9sPgotICA8bGk+PGEgaHJlZj0iI3NlcGFyYXRlLWljb25zIj5TZXBhcmF0ZSBJY29ucyBmb3IgRGlmZmVyZW50IFZlcnNpb25zIG9mIGEgUnVudGltZSBDb21wb25lbnQgVHlwZTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3Jjdi1hZGFwdGFibGUiPklSdW50aW1lQ29tcG9uZW50VmVyc2lvbiBFeHRlbmRzIElBZGFwdGFibGU8L2E+PC9saT4KLTwvb2w+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjc2VwYXJhdGUtaWNvbnMiPjEuIFNlcGFyYXRlIEljb25zIGZvciBEaWZmZXJlbnQgVmVyc2lvbnMgb2YgYSBSdW50aW1lIENvbXBvbmVudCBUeXBlPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5UaGUgPGNvZGU+aW1hZ2VzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgbm93IHN1cHBvcnRzIGEgPGNvZGU+dmVyc2lvbjwvY29kZT4gYXR0cmlidXRlIHdoZW4gdXNlZAotdG9nZXRoZXIgd2l0aCA8Y29kZT5ydW50aW1lLWNvbXBvbmVudC10eXBlPC9jb2RlPiBhdHRyaWJ1dGUuIFRoaXMgYWxsb3dzIHNlcGFyYXRlIGljb25zIHRvIGJlIHVzZWQKLWZvciBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgcnVudGltZSBjb21wb25lbnQgdHlwZS48L3A+ICAKLQotCi08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotPHA+PGZvbnQgc2l6ZT0iKzEiPjxhIG5hbWU9IiNyY3YtYWRhcHRhYmxlIj4yLiBJUnVudGltZUNvbXBvbmVudFZlcnNpb24gRXh0ZW5kcyBJQWRhcHRhYmxlPC9hPjwvZm9udD48L3A+Ci08IS0tICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08cD5JUnVudGltZUNvbXBvbmVudFZlcnNpb24gaW50ZXJmYWNlIG5vdyBleHRlbmRzIHBsYXRmb3JtJ3MgSUFkYXB0YWJsZSBpbnRlcmZhY2UuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MzEwLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL2d1aWRlL3doYXRzbmV3MzEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZmFkN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9ndWlkZS93aGF0c25ldzMxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhCi0gIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLSAgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPldoYXQncyBOZXcgZm9yIDMuMT88L3RpdGxlPgotPGxpbmsKLSAgcmVsPSJzdHlsZXNoZWV0IgotICB0eXBlPSJ0ZXh0L2NzcyIKLSAgaHJlZj0iZm9ybWF0LmNzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHAgY2xhc3M9InVlYmVyc2NocmlmdCI+V2hhdCdzIE5ldyBmb3IgMy4xPzwvcD4KLQotPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEFQSSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgZm9yIAotdGhlIFdUUCAzLjEgcmVsZWFzZS4gQm90aCBKYXZhIEFQSSBhbmQgZXh0ZW5zaW9uIHBvaW50IGNoYW5nZXMgYXJlIGNvdmVyZWQuPC9wPgotCi08b2w+Ci0gIDxsaT48YSBocmVmPSIjZnJhbWV3b3JrLWV4Y2VwdGlvbiI+RmFjZXRlZFByb2plY3RGcmFtZXdvcmtFeGNlcHRpb248L2E+PC9saT4KLTwvb2w+Ci0KLQotPCEtLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTxwPjxmb250IHNpemU9IisxIj48YSBuYW1lPSIjZnJhbWV3b3JrLWV4Y2VwdGlvbiI+MS4gRmFjZXRlZFByb2plY3RGcmFtZXdvcmtFeGNlcHRpb248L2E+PC9mb250PjwvcD4KLTwhLS0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTxwPkEgZnJhbWV3b3JrLXNwZWNpZmljIHN1YmNsYXNzIG9mIENvcmVFeGNlcHRpb24gaGFzIGJlZW4gaW50cm9kdWNlZCBpbiBvcmRlciB0byBhbGxvdyBJRGVsZWdhdGUgaW1wbGVtZW50YXRpb25zIAotYSB3YXkgdG8gc2lnbmFsIHRoYXQgYW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkLiBBbiBleGFtcGxlIG9mIGFuIGV4cGVjdGVkIGV4Y2VwdGlvbiBpcyB3aGVuIGEgdXNlciAKLWRlY2xpbmVzIHRvIG1ha2UgYSBuZWNlc3NhcnkgZmlsZSB3cml0YWJsZS4gTWFya2luZyBhbiBleGNlcHRpb24gYXMgZXhwZWN0ZWQgY2FuIGJlIHVzZWQgYXMgYSBzaWduYWwgCi1ieSBoYW5kbGVycyB0byBhbHRlciB0aGUgd2F5IHRoZSBleGNlcHRpb24gaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChwZXJoYXBzIG5vdCBkaXNwbGF5aW5nIHRoZSAKLXN0YWNrIHRyYWNlIGFuZC9vciBub3QgbG9nZ2luZyBpdCkuPC9wPgotCi08cD48dT5KYXZhIEFQSSBBZGRpdGlvbnM8L3U+PC9wPgotCi08dGFibGUgY2VsbHBhZGRpbmc9IjEwIj48dHI+PHRkIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD48dGQgYmdjb2xvcj0iI0UyRTJFMiI+Ci08cHJlPgotaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uIGV4dGVuZHMgQ29yZUV4Y2VwdGlvbgotewotICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrRXhjZXB0aW9uKCBJU3RhdHVzIHN0YXR1cyApOwotICAgIGJvb2xlYW4gaXNFeHBlY3RlZCgpOwotICAgIHZvaWQgc2V0RXhjcGV0ZWQoIGJvb2xlYW4gZXhwZWN0ZWQgKTsKLX0KLTwvcHJlPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9qYXZhZG9jLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvamF2YWRvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZThiN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9qYXZhZG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPHByb2plY3QgZGVmYXVsdD0iZXhwb3J0LWphdmFkb2MiPgotCQotICA8dGFyZ2V0IG5hbWU9ImV4cG9ydC1qYXZhZG9jIj4KLSAgCTxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuZGlyIiB2YWx1ZT0icmVmZXJlbmNlL2FwaSIvPgotICAJPG1rZGlyIGRpcj0iJHtqYXZhZG9jLmRpcn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhZG9jLmRpcn0iLz4KLSAgCTxta2RpciBkaXI9IiR7amF2YWRvYy5kaXJ9Ii8+Ci0gICAgPGphdmFkb2MKLSAgICAgIG1heG1lbW9yeT0iMTAyNG0iCi0gICAgICBkZXN0ZGlyPSIke2phdmFkb2MuZGlyfSIgCi0gICAgICBhY2Nlc3M9InByb3RlY3RlZCIgCi0gICAgICBhdXRob3I9InRydWUiCi0gICAgICB2ZXJzaW9uPSJ0cnVlIgotICAgICAgc3BsaXRpbmRleD0idHJ1ZSIgCi0gICAgICB1c2U9InRydWUiCi0gICAgICBmYWlsb25lcnJvcj0idHJ1ZSIKLSAgICAgIGV4ZWN1dGFibGU9IiR7ZW52LkpBVkFfNV9IT01FfS9iaW4vamF2YWRvYyI+Ci0gICAgICA8ZG9jdGl0bGU+RmFjZXRlZCBQcm9qZWN0IEZyYW1ld29yazwvZG9jdGl0bGU+Ci0gICAgICA8aGVhZGVyPjwhW0NEQVRBWzxiPkZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcms8L2I+PGJyLz5WZXJzaW9uIDEuM11dPjwvaGVhZGVyPgotICAgICAgPGZvb3Rlcj48IVtDREFUQVs8Yj5GYWNldGVkIFByb2plY3QgRnJhbWV3b3JrPC9iPjxici8+VmVyc2lvbiAxLjNdXT48L2Zvb3Rlcj4KLSAgICAgIDxib3R0b20+PCFbQ0RBVEFbQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXV0+PC9ib3R0b20+Ci0gICAgICA8Z3JvdXAgdGl0bGU9IkNvcmUgUGFja2FnZXMiIHBhY2thZ2VzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTpvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS4qIi8+Ci0gICAgICA8Z3JvdXAgdGl0bGU9IlVJIFBhY2thZ2VzIiBwYWNrYWdlcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIi8+Ci0gICAgICA8cGFja2FnZXNldCBkaXI9Ii4uL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlL3NyYyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovaW50ZXJuYWwvKioiLz4KLSAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpL3NyYyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovaW50ZXJuYWwvKioiLz4KLSAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IkBkb3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41L2RvY3MvYXBpIiBvZmZsaW5lPSJ0cnVlIiBwYWNrYWdlbGlzdExvYz0icGFja2FnZS1saXN0cy9qYXZhIi8+Ci0gICAgICA8bGluayBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9yZWZlcmVuY2UvYXBpIiBvZmZsaW5lPSJ0cnVlIiBwYWNrYWdlbGlzdExvYz0icGFja2FnZS1saXN0cy9lY2xpcHNlLXBsYXRmb3JtIi8+Ci0gICAgPC9qYXZhZG9jPgotICA8L3RhcmdldD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGFja2FnZS1saXN0cy9lY2xpcHNlLXBsYXRmb3JtL3BhY2thZ2UtbGlzdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGFja2FnZS1saXN0cy9lY2xpcHNlLXBsYXRmb3JtL3BhY2thZ2UtbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyYzcyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BhY2thZ2UtbGlzdHMvZWNsaXBzZS1wbGF0Zm9ybS9wYWNrYWdlLWxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotb3JnLmVjbGlwc2UuYW50LmNvcmUKLW9yZy5lY2xpcHNlLmNvbXBhcmUKLW9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudG1lcmdldmlld2VyCi1vcmcuZWNsaXBzZS5jb21wYXJlLnBhdGNoCi1vcmcuZWNsaXBzZS5jb21wYXJlLnJhbmdlZGlmZmVyZW5jZXIKLW9yZy5lY2xpcHNlLmNvbXBhcmUuc3RydWN0dXJlbWVyZ2V2aWV3ZXIKLW9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMKLW9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuY29tbW9uCi1vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbnRleHRzCi1vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuYmVhbnMKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuY29udmVyc2lvbgotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlCi1vcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLm9ic2VydmFibGUubGlzdAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLm1hcAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLm1hc3RlcmRldGFpbAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLnNldAotb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZy5vYnNlcnZhYmxlLnZhbHVlCi1vcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLnV0aWwKLW9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcudmFsaWRhdGlvbgotb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucwotb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycwotb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5tYW5pcHVsYXRpb24KLW9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbQotb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnByb3ZpZGVyCi1vcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eQotb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKLW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcKLW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnJlZnJlc2gKLW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRlYW0KLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IKLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50Ci1vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuZHluYW1pY2hlbHBlcnMKLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzCi1vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUubW9kZWwKLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcwotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnNwaQotb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuY29tbWFuZHMKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwKLW9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwCi1vcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzCi1vcmcuZWNsaXBzZS5kZWJ1Zy51aQotb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucwotb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZQotb3JnLmVjbGlwc2UuZGVidWcudWkuY29udGV4dHMKLW9yZy5lY2xpcHNlLmRlYnVnLnVpLm1lbW9yeQotb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwCi1vcmcuZWNsaXBzZS5lcXVpbm94LmFwcAotb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5Ci1vcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAucmVnaXN0cnkKLW9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5zZXJ2bGV0Ci1vcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIKLW9yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3Blci5yZWdpc3RyeQotb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5hdXRoCi1vcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LmF1dGguY3JlZGVudGlhbHMKLW9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuYXV0aC5tb2R1bGUKLW9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuc3RvcmFnZQotb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5zdG9yYWdlLnByb3ZpZGVyCi1vcmcuZWNsaXBzZS5oZWxwCi1vcmcuZWNsaXBzZS5oZWxwLmJyb3dzZXIKLW9yZy5lY2xpcHNlLmhlbHAuc2VhcmNoCi1vcmcuZWNsaXBzZS5oZWxwLnN0YW5kYWxvbmUKLW9yZy5lY2xpcHNlLmhlbHAudWkKLW9yZy5lY2xpcHNlLmhlbHAudWkuYnJvd3Nlcgotb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uCi1vcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncwotb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cwotb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5mb3JtYXR0aW5nCi1vcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kcwotb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdAotb3JnLmVjbGlwc2UuamZhY2UuY29udGV4dHMKLW9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLnN3dAotb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcudmlld2Vycwotb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcud2l6YXJkCi1vcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzCi1vcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdAotb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0Ci1vcmcuZWNsaXBzZS5qZmFjZS5tZW51cwotb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uCi1vcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlCi1vcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZQotb3JnLmVjbGlwc2UuamZhY2UudGV4dAotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0Ci1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlcgotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24KLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluawotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24KLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJvamVjdGlvbgotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdAotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJldmlzaW9ucwotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcwotb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UKLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24KLW9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzCi1vcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZQotb3JnLmVjbGlwc2UuamZhY2UudXRpbAotb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycwotb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5kZWZlcnJlZAotb3JnLmVjbGlwc2UuamZhY2Uud2luZG93Ci1vcmcuZWNsaXBzZS5qZmFjZS53aXphcmQKLW9yZy5lY2xpcHNlLmpzY2guY29yZQotb3JnLmVjbGlwc2UuanNjaC51aQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmhpc3RvcnkKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLm1vZGVsCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlc291cmNlCi1vcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcKLW9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5hY3Rpb25zCi1vcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuaGlzdG9yeQotb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLm1vZGVsCi1vcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcucmVzb3VyY2UKLW9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24KLW9yZy5lY2xpcHNlLm9zZ2kudXRpbAotb3JnLmVjbGlwc2Uuc2VhcmNoLmNvcmUudGV4dAotb3JnLmVjbGlwc2Uuc2VhcmNoLnVpCi1vcmcuZWNsaXBzZS5zZWFyY2gudWkuYWN0aW9ucwotb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQKLW9yZy5lY2xpcHNlLnN3dAotb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkKLW9yZy5lY2xpcHNlLnN3dC5hd3QKLW9yZy5lY2xpcHNlLnN3dC5icm93c2VyCi1vcmcuZWNsaXBzZS5zd3QuY3VzdG9tCi1vcmcuZWNsaXBzZS5zd3QuZG5kCi1vcmcuZWNsaXBzZS5zd3QuZXZlbnRzCi1vcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MKLW9yZy5lY2xpcHNlLnN3dC5sYXlvdXQKLW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIKLW9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wKLW9yZy5lY2xpcHNlLnN3dC5wcmludGluZwotb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0KLW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS5kaWZmCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUuZGlmZi5wcm92aWRlcgotb3JnLmVjbGlwc2UudGVhbS5jb3JlLmhpc3RvcnkKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS5oaXN0b3J5LnByb3ZpZGVyCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUubWFwcGluZwotb3JnLmVjbGlwc2UudGVhbS5jb3JlLm1hcHBpbmcucHJvdmlkZXIKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS5zdWJzY3JpYmVycwotb3JnLmVjbGlwc2UudGVhbS5jb3JlLnN5bmNocm9uaXplCi1vcmcuZWNsaXBzZS50ZWFtLmNvcmUudmFyaWFudHMKLW9yZy5lY2xpcHNlLnRlYW0udWkKLW9yZy5lY2xpcHNlLnRlYW0udWkuaGlzdG9yeQotb3JnLmVjbGlwc2UudGVhbS51aS5tYXBwaW5nCi1vcmcuZWNsaXBzZS50ZWFtLnVpLnN5bmNocm9uaXplCi1vcmcuZWNsaXBzZS50ZXh0LmVkaXRzCi1vcmcuZWNsaXBzZS50ZXh0LnVuZG8KLW9yZy5lY2xpcHNlLnVpCi1vcmcuZWNsaXBzZS51aS5hYm91dAotb3JnLmVjbGlwc2UudWkuYWN0aW9ucwotb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcwotb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24KLW9yZy5lY2xpcHNlLnVpLmJyYW5kaW5nCi1vcmcuZWNsaXBzZS51aS5icm93c2VyCi1vcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cwotb3JnLmVjbGlwc2UudWkuY29tbWFuZHMKLW9yZy5lY2xpcHNlLnVpLmNvbnNvbGUKLW9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuYWN0aW9ucwotb3JnLmVjbGlwc2UudWkuY29udGVudGFzc2lzdAotb3JnLmVjbGlwc2UudWkuY29udGV4dHMKLW9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MKLW9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dAotb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcwotb3JnLmVjbGlwc2UudWkuZmllbGRhc3Npc3QKLW9yZy5lY2xpcHNlLnVpLmZvcm1zCi1vcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IKLW9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cwotb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cwotb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMKLW9yZy5lY2xpcHNlLnVpLmhlbHAKLW9yZy5lY2xpcHNlLnVpLmlkZQotb3JnLmVjbGlwc2UudWkuaWRlLmRpYWxvZ3MKLW9yZy5lY2xpcHNlLnVpLmlkZS5maWxlU3lzdGVtCi1vcmcuZWNsaXBzZS51aS5pZGUudW5kbwotb3JnLmVjbGlwc2UudWkuaW50cm8KLW9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZwotb3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsCi1vcmcuZWNsaXBzZS51aS5rZXlzCi1vcmcuZWNsaXBzZS51aS5tZW51cwotb3JnLmVjbGlwc2UudWkubW9kZWwKLW9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcgotb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcwotb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucwotb3JnLmVjbGlwc2UudWkucGFydAotb3JnLmVjbGlwc2UudWkucGx1Z2luCi1vcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcwotb3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucwotb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MKLW9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzCi1vcmcuZWNsaXBzZS51aS5zdGF0dXNoYW5kbGVycwotb3JnLmVjbGlwc2UudWkuc3d0Ci1vcmcuZWNsaXBzZS51aS50ZXN0aW5nCi1vcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yCi1vcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLmxpbmsKLW9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucXVpY2tkaWZmCi1vcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVycwotb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZwotb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMKLW9yZy5lY2xpcHNlLnVpLnRoZW1lcwotb3JnLmVjbGlwc2UudWkudmlld3MKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLmJvb2ttYXJrZXhwbG9yZXIKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1vcmcuZWNsaXBzZS51aS52aWV3cy5mcmFtZWxpc3QKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvcgotb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcwotb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQKLW9yZy5lY2xpcHNlLnVpLnZpZXdzLnRhc2tsaXN0Ci1vcmcuZWNsaXBzZS51aS53aXphcmRzCi1vcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlcgotb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZQotb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IKLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbAotb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMKLW9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2gKLW9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BhY2thZ2UtbGlzdHMvamF2YS9wYWNrYWdlLWxpc3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BhY2thZ2UtbGlzdHMvamF2YS9wYWNrYWdlLWxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzgzMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9wYWNrYWdlLWxpc3RzL2phdmEvcGFja2FnZS1saXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLWphdmEuYXBwbGV0Ci1qYXZhLmF3dAotamF2YS5hd3QuY29sb3IKLWphdmEuYXd0LmRhdGF0cmFuc2ZlcgotamF2YS5hd3QuZG5kCi1qYXZhLmF3dC5ldmVudAotamF2YS5hd3QuZm9udAotamF2YS5hd3QuZ2VvbQotamF2YS5hd3QuaW0KLWphdmEuYXd0LmltLnNwaQotamF2YS5hd3QuaW1hZ2UKLWphdmEuYXd0LmltYWdlLnJlbmRlcmFibGUKLWphdmEuYXd0LnByaW50Ci1qYXZhLmJlYW5zCi1qYXZhLmJlYW5zLmJlYW5jb250ZXh0Ci1qYXZhLmlvCi1qYXZhLmxhbmcKLWphdmEubGFuZy5hbm5vdGF0aW9uCi1qYXZhLmxhbmcuaW5zdHJ1bWVudAotamF2YS5sYW5nLm1hbmFnZW1lbnQKLWphdmEubGFuZy5yZWYKLWphdmEubGFuZy5yZWZsZWN0Ci1qYXZhLm1hdGgKLWphdmEubmV0Ci1qYXZhLm5pbwotamF2YS5uaW8uY2hhbm5lbHMKLWphdmEubmlvLmNoYW5uZWxzLnNwaQotamF2YS5uaW8uY2hhcnNldAotamF2YS5uaW8uY2hhcnNldC5zcGkKLWphdmEucm1pCi1qYXZhLnJtaS5hY3RpdmF0aW9uCi1qYXZhLnJtaS5kZ2MKLWphdmEucm1pLnJlZ2lzdHJ5Ci1qYXZhLnJtaS5zZXJ2ZXIKLWphdmEuc2VjdXJpdHkKLWphdmEuc2VjdXJpdHkuYWNsCi1qYXZhLnNlY3VyaXR5LmNlcnQKLWphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcwotamF2YS5zZWN1cml0eS5zcGVjCi1qYXZhLnNxbAotamF2YS50ZXh0Ci1qYXZhLnV0aWwKLWphdmEudXRpbC5jb25jdXJyZW50Ci1qYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMKLWphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzCi1qYXZhLnV0aWwuamFyCi1qYXZhLnV0aWwubG9nZ2luZwotamF2YS51dGlsLnByZWZzCi1qYXZhLnV0aWwucmVnZXgKLWphdmEudXRpbC56aXAKLWphdmF4LmFjY2Vzc2liaWxpdHkKLWphdmF4LmFjdGl2aXR5Ci1qYXZheC5jcnlwdG8KLWphdmF4LmNyeXB0by5pbnRlcmZhY2VzCi1qYXZheC5jcnlwdG8uc3BlYwotamF2YXguaW1hZ2VpbwotamF2YXguaW1hZ2Vpby5ldmVudAotamF2YXguaW1hZ2Vpby5tZXRhZGF0YQotamF2YXguaW1hZ2Vpby5wbHVnaW5zLmJtcAotamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcKLWphdmF4LmltYWdlaW8uc3BpCi1qYXZheC5pbWFnZWlvLnN0cmVhbQotamF2YXgubWFuYWdlbWVudAotamF2YXgubWFuYWdlbWVudC5sb2FkaW5nCi1qYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4KLWphdmF4Lm1hbmFnZW1lbnQubW9uaXRvcgotamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4KLWphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24KLWphdmF4Lm1hbmFnZW1lbnQucmVtb3RlCi1qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkKLWphdmF4Lm1hbmFnZW1lbnQudGltZXIKLWphdmF4Lm5hbWluZwotamF2YXgubmFtaW5nLmRpcmVjdG9yeQotamF2YXgubmFtaW5nLmV2ZW50Ci1qYXZheC5uYW1pbmcubGRhcAotamF2YXgubmFtaW5nLnNwaQotamF2YXgubmV0Ci1qYXZheC5uZXQuc3NsCi1qYXZheC5wcmludAotamF2YXgucHJpbnQuYXR0cmlidXRlCi1qYXZheC5wcmludC5hdHRyaWJ1dGUuc3RhbmRhcmQKLWphdmF4LnByaW50LmV2ZW50Ci1qYXZheC5ybWkKLWphdmF4LnJtaS5DT1JCQQotamF2YXgucm1pLnNzbAotamF2YXguc2VjdXJpdHkuYXV0aAotamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjawotamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcwotamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbgotamF2YXguc2VjdXJpdHkuYXV0aC5zcGkKLWphdmF4LnNlY3VyaXR5LmF1dGgueDUwMAotamF2YXguc2VjdXJpdHkuY2VydAotamF2YXguc2VjdXJpdHkuc2FzbAotamF2YXguc291bmQubWlkaQotamF2YXguc291bmQubWlkaS5zcGkKLWphdmF4LnNvdW5kLnNhbXBsZWQKLWphdmF4LnNvdW5kLnNhbXBsZWQuc3BpCi1qYXZheC5zcWwKLWphdmF4LnNxbC5yb3dzZXQKLWphdmF4LnNxbC5yb3dzZXQuc2VyaWFsCi1qYXZheC5zcWwucm93c2V0LnNwaQotamF2YXguc3dpbmcKLWphdmF4LnN3aW5nLmJvcmRlcgotamF2YXguc3dpbmcuY29sb3JjaG9vc2VyCi1qYXZheC5zd2luZy5ldmVudAotamF2YXguc3dpbmcuZmlsZWNob29zZXIKLWphdmF4LnN3aW5nLnBsYWYKLWphdmF4LnN3aW5nLnBsYWYuYmFzaWMKLWphdmF4LnN3aW5nLnBsYWYubWV0YWwKLWphdmF4LnN3aW5nLnBsYWYubXVsdGkKLWphdmF4LnN3aW5nLnBsYWYuc3ludGgKLWphdmF4LnN3aW5nLnRhYmxlCi1qYXZheC5zd2luZy50ZXh0Ci1qYXZheC5zd2luZy50ZXh0Lmh0bWwKLWphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXIKLWphdmF4LnN3aW5nLnRleHQucnRmCi1qYXZheC5zd2luZy50cmVlCi1qYXZheC5zd2luZy51bmRvCi1qYXZheC50cmFuc2FjdGlvbgotamF2YXgudHJhbnNhY3Rpb24ueGEKLWphdmF4LnhtbAotamF2YXgueG1sLmRhdGF0eXBlCi1qYXZheC54bWwubmFtZXNwYWNlCi1qYXZheC54bWwucGFyc2VycwotamF2YXgueG1sLnRyYW5zZm9ybQotamF2YXgueG1sLnRyYW5zZm9ybS5kb20KLWphdmF4LnhtbC50cmFuc2Zvcm0uc2F4Ci1qYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbQotamF2YXgueG1sLnZhbGlkYXRpb24KLWphdmF4LnhtbC54cGF0aAotb3JnLmlldGYuamdzcwotb3JnLm9tZy5DT1JCQQotb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlCi1vcmcub21nLkNPUkJBLk9SQlBhY2thZ2UKLW9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlCi1vcmcub21nLkNPUkJBLnBvcnRhYmxlCi1vcmcub21nLkNPUkJBXzJfMwotb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUKLW9yZy5vbWcuQ29zTmFtaW5nCi1vcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0UGFja2FnZQotb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UKLW9yZy5vbWcuRHluYW1pYwotb3JnLm9tZy5EeW5hbWljQW55Ci1vcmcub21nLkR5bmFtaWNBbnkuRHluQW55RmFjdG9yeVBhY2thZ2UKLW9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlQYWNrYWdlCi1vcmcub21nLklPUAotb3JnLm9tZy5JT1AuQ29kZWNGYWN0b3J5UGFja2FnZQotb3JnLm9tZy5JT1AuQ29kZWNQYWNrYWdlCi1vcmcub21nLk1lc3NhZ2luZwotb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yCi1vcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IuT1JCSW5pdEluZm9QYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLkN1cnJlbnRQYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQU1hbmFnZXJQYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQVBhY2thZ2UKLW9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudExvY2F0b3JQYWNrYWdlCi1vcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlCi1vcmcub21nLlNlbmRpbmdDb250ZXh0Ci1vcmcub21nLnN0dWIuamF2YS5ybWkKLW9yZy53M2MuZG9tCi1vcmcudzNjLmRvbS5ib290c3RyYXAKLW9yZy53M2MuZG9tLmV2ZW50cwotb3JnLnczYy5kb20ubHMKLW9yZy54bWwuc2F4Ci1vcmcueG1sLnNheC5leHQKLW9yZy54bWwuc2F4LmhlbHBlcnMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5kb2MuYXBpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmVmY2NiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBsdWdpbk5hbWUgPSBGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIEFQSSBEb2N1bWVudGF0aW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTZjNjI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJ0b2MueG1sIiBwcmltYXJ5PSJ0cnVlIj4KLSAgICA8L3RvYz4KLSAgPC9leHRlbnNpb24+Ci0JCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLmphdmFkb2MiPgotICAgIDxqYXZhZG9jIHBhdGg9InJlZmVyZW5jZS9hcGkiPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aSIvPgotICAgIDwvamF2YWRvYz4KLSAgPC9leHRlbnNpb24+Ci0gICAJCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvc3JjLy5kby1ub3QtZGVsZXRlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9zcmMvLmRvLW5vdC1kZWxldGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS9zcmMvLmRvLW5vdC1kZWxldGUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS90b2MueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuZG9jLmFwaS90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWYwZWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmRvYy5hcGkvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJGYWNldGVkIFByb2plY3QgRnJhbWV3b3JrIERldmVsb3BlciBHdWlkZSI+Ci0KLSAgPHRvcGljIGxhYmVsPSJQcm9ncmFtbWVyJ3MgR3VpZGUiIGhyZWY9Imd1aWRlL2Rlc2NyaXB0aW9uLmh0bWwiPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJUdXRvcmlhbCIgCi0gICAgICBocmVmPSJndWlkZS90dXRvcmlhbC90dXRvcmlhbC5odG1sIi8+Ci0gICAgPHRvcGljIAotICAgICAgbGFiZWw9Ikxpc3RlbmluZyBmb3IgQ2hhbmdlcyB0byBGYWNldGVkIFByb2plY3RzIgotICAgICAgaHJlZj0iZ3VpZGUvbGlzdGVuZXJzLmh0bWwiLz4KLSAgICA8dG9waWMgCi0gICAgICBsYWJlbD0iRW5hYmxpbmcgVUkgRWxlbWVudHMgQmFzZWQgb24gUHJvamVjdCBGYWNldHMiCi0gICAgICBocmVmPSJndWlkZS9lbmFibGluZy1iYXNlZC1vbi1mYWNldHMuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJRdWVzdGlvbnMgJmFtcDsgQW5zd2VycyIKLSAgICAgIGhyZWY9Imd1aWRlL3F1ZXN0aW9ucy5odG1sIi8+Ci0gICAgPHRvcGljIAotICAgICAgbGFiZWw9Ik5ldyBmb3IgMS41IgotICAgICAgaHJlZj0iZ3VpZGUvd2hhdHNuZXcxNTAuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJOZXcgZm9yIDEuNS4xIgotICAgICAgaHJlZj0iZ3VpZGUvd2hhdHNuZXcxNTEuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJOZXcgZm9yIDIuMCIKLSAgICAgIGhyZWY9Imd1aWRlL3doYXRzbmV3MjAuaHRtbCIvPgotICAgIDx0b3BpYyAKLSAgICAgIGxhYmVsPSJOZXcgZm9yIDMuMC4xIgotICAgICAgaHJlZj0iZ3VpZGUvd2hhdHNuZXczMDEuaHRtbCIvPgotICA8L3RvcGljPgotICAgIAotICA8dG9waWMgbGFiZWw9IlJlZmVyZW5jZSI+Ci0gICAgPHRvcGljIGxhYmVsPSJBUEkgUmVmZXJlbmNlIiBocmVmPSJyZWZlcmVuY2UvYXBpL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Ci0gICAgICA8dG9waWMgCi0gICAgICAgIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIKLSAgICAgICAgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIvPgotICAgICAgPHRvcGljCi0gICAgICAgIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMiCi0gICAgICAgIGhyZWY9InJlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvZXZlbnRzL3BhY2thZ2Utc3VtbWFyeS5odG1sIi8+Ci0gICAgICA8dG9waWMKLSAgICAgICAgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUiCi0gICAgICAgIGhyZWY9InJlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvcnVudGltZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIvPgotICAgICAgPHRvcGljCi0gICAgICAgIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLmV2ZW50cyIKLSAgICAgICAgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS9ydW50aW1lL2V2ZW50cy9wYWNrYWdlLXN1bW1hcnkuaHRtbCIvPgotICAgICAgPHRvcGljCi0gICAgICAgIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsIgotICAgICAgICBocmVmPSJyZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3V0aWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiLz4KLSAgICAgIDx0b3BpYwotICAgICAgICBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIgotICAgICAgICBocmVmPSJyZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIvPgotICAgIDwvdG9waWM+Ci0gIDwvdG9waWM+ICAgCi0gICAgICAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlODIwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1qYXZhQ29tcGlsZXIudGVzdHMuamFyLmFyZ3MKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkODBmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1ZjFjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgRmViIDAyIDE2OjUxOjM5IFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTE2OWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZTogRmFjZXQgQ29yZSBUZXN0cyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4yLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydAotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5YmRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzUwMmMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICByZXNvdXJjZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB0ZXN0cy5qYXIKLXNvdXJjZS50ZXN0cy5qYXIgPSBzcmMvCi1vdXRwdXQudGVzdHMuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4MzMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzCi1CdW5kbGUtTmFtZS4wID0gRmFjZXQgQ29yZSBUZXN0cyBQbHVnLWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYmE1YzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotCi08cGx1Z2luPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgICAKLSAgICA8Y2F0ZWdvcnkgaWQ9ImNhdDEiPgotICAgICAgPGxhYmVsPkNhdGVnb3J5IDE8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIGNhdGVnb3J5IGRlc2NyaXB0aW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeT4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmYWNldDEiPgotICAgICAgPGxhYmVsPkZhY2V0IDE8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIGZhY2V0MS48L2Rlc2NyaXB0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9Imluc3RhbGwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gdHlwZT0idW5pbnN0YWxsIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MVVuaW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gdHlwZT0idmVyc2lvbi1jaGFuZ2UiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxVmVyc2lvbkNoYW5nZURlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMiI+Ci0gICAgICA8YWN0aW9uIHR5cGU9Imluc3RhbGwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gdHlwZT0idW5pbnN0YWxsIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0MVVuaW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICAgIDxhY3Rpb24gdHlwZT0idmVyc2lvbi1jaGFuZ2UiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxVmVyc2lvbkNoYW5nZURlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjMiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjIuMCIvPgotCi0gICAgPGFjdGlvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSJbMS4yLjEtMi4wXSIgdHlwZT0iaW5zdGFsbCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQxSW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgCi0gICAgPGFjdGlvbiBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSJbMS4yLjEtMi4wXSIgdHlwZT0idW5pbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFVbmluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIAotICAgIDxhY3Rpb24gZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iWzEuMi4xLTIuMF0iIHR5cGU9InZlcnNpb24tY2hhbmdlIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5GYWNldDFWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmFjZXQyIj4KLSAgICAgIDx2ZXJzaW9uLWNvbXBhcmF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuQ3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IiLz4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9ImNhdDEiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQyIiB2ZXJzaW9uPSIzLjUiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDIiIHZlcnNpb249IjMuNSNhIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSJbMS4yLTEuMykiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQyIiB2ZXJzaW9uPSI0LjciPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICA8L29yPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0MiIgdmVyc2lvbj0iNC43I2IiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjIuMCIvPgotICAgICAgICA8L29yPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgICAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDIiIHZlcnNpb249IjQuNyNjIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMyIvPgotICAgICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjIuMCIvPgotICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0iZmFjZXQzYSIvPgotICAgICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImZhY2V0M2IiIHZlcnNpb249IjEuMCIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Imdyb3VwMSIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Imdyb3VwMSIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmYWNldDJleHQiPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0iY2F0MSIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYWNldDJleHQiIHZlcnNpb249IjEuMCIvPgotCi0gICAgPGNhdGVnb3J5IGlkPSJjYXQyIi8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZhY2V0M2EiPiA8IS0tIFRlc3RzIGEgZmFjZXQgd2l0aCBubyBkZXNjcmlwdGlvbi4gLS0+Ci0gICAgICA8bWVtYmVyIGNhdGVnb3J5PSJjYXQyIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0M2EiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0M2EiIHZlcnNpb249IjIuMCIvPgotICAgIAotICAgIDxhY3Rpb24gZmFjZXQ9ImZhY2V0M2EiIHZlcnNpb249IlsxLjAtMi4wXSIgdHlwZT0iaW5zdGFsbCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuRmFjZXQzYUluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotCi0gICAgPGFjdGlvbiBmYWNldD0iZmFjZXQzYSIgdmVyc2lvbj0iWzEuMC0yLjBdIiB0eXBlPSJ1bmluc3RhbGwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0M2FVbmluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIAotICAgIDxhY3Rpb24gZmFjZXQ9ImZhY2V0M2EiIHZlcnNpb249IlsxLjAtMi4wXSIgdHlwZT0idmVyc2lvbi1jaGFuZ2UiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkZhY2V0M2FWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmYWNldDNiIj4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9ImNhdDIiLz4KLSAgICAgIDxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiA8IS0tIFRlc3RzIGEgZmFjZXQgd2l0aCBhbiBlbXB0eSBkZXNjcmlwdGlvbi4gLS0+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0M2IiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhY2V0M2IiIHZlcnNpb249IjIuMCIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmYWNldDNjIj4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9ImNhdDIiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQzYyIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Imdyb3VwMSIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmFjZXQzYyIgdmVyc2lvbj0iMi4wIj4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Imdyb3VwMSIvPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPCEtLSBQcmVzZXRzVGVzdHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzIj4KLSAgCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X3ByZXNldDEiPgotICAgICAgPGxhYmVsPlByZXNldCAxPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGZpcnN0IHByZXNldC48L2Rlc2NyaXB0aW9uPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDEiIHZlcnNpb249IjIuMCIvPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDIiIHZlcnNpb249IjMuNSNhIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MmV4dCIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X3ByZXNldDIiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDNhIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQzYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0M2MiIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLSAgICAKLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfcHJlc2V0MyIgZXh0ZW5kcz0icHRfcHJlc2V0MSI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0M2EiIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+ICA8IS0tIFRlc3RzIHRoYXQgdGhlIHZlcnNpb24gaW4gZGVyaXZlZCBwcmVzZXQgd2lucy4gLS0+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PiAgICAgIAotCi0gICAgPGR5bmFtaWMtcHJlc2V0IGlkPSJwdF9keW5fcHJlc2V0Ij4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5QcmVzZXRzVGVzdHMkUHJlc2V0RmFjdG9yeSIvPgotICAgIDwvZHluYW1pYy1wcmVzZXQ+ICAgICAgCi0KLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8xIiBleHRlbmRzPSJwdF9keW5fcHJlc2V0Ij4KLSAgICAgIDxsYWJlbD5TdGF0aWMgRXh0ZW5kaW5nIER5bmFtaWMgUHJlc2V0PC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBzdGF0aWMtZHluYW1pYyBkZXNjcmlwdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDIiIHZlcnNpb249IjMuNSNhIi8+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0M2IiIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLQotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzIiIGV4dGVuZHM9InB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMSI+Ci0gICAgICA8bGFiZWw+U3RhdGljIEV4dGVuZGluZyBEeW5hbWljIFByZXNldCAyPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBzdGF0aWMtZHluYW1pYyBkZXNjcmlwdGlvbiAyLjwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQzYSIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotCi0gICAgPCEtLSBSZWZlcmVuY2VzIGZhY2V0IHRoYXQgZG9lc24ndCBleGlzdC4gLS0+Ci0gICAgCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X2JhZC5wcmVzZXQxIj4KLSAgICAgIDxmYWNldCBpZD0iYWJjIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0KLSAgICA8IS0tIFJlZmVyZW5jZXMgZmFjZXQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZXhpc3QuIC0tPgotICAgIAotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9iYWQucHJlc2V0MiI+Ci0gICAgICA8ZmFjZXQgaWQ9ImZhY2V0MiIgdmVyc2lvbj0iOTkuOTgiLz4KLSAgICA8L3N0YXRpYy1wcmVzZXQ+Ci0KLSAgICA8IS0tIFJlZmVyZW5jZXMgYmFzZSBwcmVzZXQgdGhhdCBkb2Vzbid0IGV4aXN0LiAtLT4KLSAgICAKLSAgICA8c3RhdGljLXByZXNldCBpZD0icHRfYmFkLnByZXNldDMiIGV4dGVuZHM9ImRvZXMubm90LmV4aXN0Ij4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQyIiB2ZXJzaW9uPSIzLjUjYSIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLSAgICAKLSAgICA8IS0tIFRoZSBmb2xsb3dpbmcgZm91ciBwcmVzZXRzIGZvcm0gYSBjeWNsZS4gLS0+Ci0gICAgCi0gICAgPHN0YXRpYy1wcmVzZXQgaWQ9InB0X2N5Y2xlX3ByZXNldDEiIGV4dGVuZHM9InB0X2N5Y2xlX3ByZXNldDMiPgotICAgICAgPGZhY2V0IGlkPSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgPC9zdGF0aWMtcHJlc2V0PgotICAgIAotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9jeWNsZV9wcmVzZXQyIiBleHRlbmRzPSJwdF9jeWNsZV9wcmVzZXQxIj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLQotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9jeWNsZV9wcmVzZXQzIiBleHRlbmRzPSJwdF9jeWNsZV9wcmVzZXQyIj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLQotICAgIDxzdGF0aWMtcHJlc2V0IGlkPSJwdF9jeWNsZV9wcmVzZXQ0IiBleHRlbmRzPSJwdF9jeWNsZV9wcmVzZXQzIj4KLSAgICAgIDxmYWNldCBpZD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjIuMSIvPgotICAgIDwvc3RhdGljLXByZXNldD4KLSAgICAKLSAgPC9leHRlbnNpb24+ICAKLQotICA8IS0tIEZhY2V0IENvbnN0cmFpbnQgVGVzdHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2YxIi8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2YxIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImZjdF9mMiIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjIiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjIiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0iZmN0X2Y0Ii8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjMiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjMiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmY3RfZjIiIHZlcnNpb249IjEuMCIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mNCIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNCIgdmVyc2lvbj0iMS4wIj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mNSIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZjdF9mMiIgdmVyc2lvbj0iMS4wIiBzb2Z0PSJ0cnVlIi8+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZmN0X2Y2Ii8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y2IiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjYiIHZlcnNpb249IjIuMyIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mNiIgdmVyc2lvbj0iMy43Ii8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y2IiB2ZXJzaW9uPSI0LjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjYiIHZlcnNpb249IjQuNSIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjciLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjciIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJmY3RfZjYiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y3IiB2ZXJzaW9uPSIyLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxyZXF1aXJlcyBmYWNldD0iZmN0X2Y2IiB2ZXJzaW9uPSJbNS4wLTYuNSkiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmY3RfZjgiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmY3RfZjgiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJmY3RfZzEiLz4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgICAgICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mOCIgdmVyc2lvbj0iMi4wIj4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9ImZjdF9nMSIvPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2Y4IiB2ZXJzaW9uPSIzLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mOSIvPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mOSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9ImZjdF9nMSIvPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImZjdF9mMTAiLz4KLQotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZjdF9mMTAiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8Y29uc3RyYWludD4KLSAgICAgICAgPHJlcXVpcmVzIGdyb3VwPSJmY3RfZzEiLz4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZmN0X2YxMCIgdmVyc2lvbj0iMi4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8cmVxdWlyZXMgZ3JvdXA9ImZjdF9nMSIgc29mdD0idHJ1ZSIvPgotICAgICAgPC9jb25zdHJhaW50PgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gICAgPGdyb3VwIGlkPSJmY3RfZzEiPgotICAgICAgPGxhYmVsPkZDVCBHcm91cCAxPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBkZXNjcmlwdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgIDwvZ3JvdXA+Ci0KLSAgPC9leHRlbnNpb24+Ci0KLSAgPCEtLSBEZWZhdWx0IFZlcnNpb24gVGVzdHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZHZ0X2YxIi8+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YxIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjEiIHZlcnNpb249IjIuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMSIgdmVyc2lvbj0iMy4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YxIiB2ZXJzaW9uPSI0LjAiLz4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJkdnRfZjIiPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YyIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjIiIHZlcnNpb249IjIuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMiIgdmVyc2lvbj0iMy4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YyIiB2ZXJzaW9uPSI0LjAiLz4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJkdnRfZjMiPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiBwcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRGVmYXVsdFZlcnNpb25UZXN0cyRGYWNldER2dEYzRGVmYXVsdFZlcnNpb25Qcm92aWRlciIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjMiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mMyIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2YzIiB2ZXJzaW9uPSIzLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjMiIHZlcnNpb249IjQuMCIvPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImR2dF9mNCI+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5EZWZhdWx0VmVyc2lvblRlc3RzJEZhY2V0RHZ0RjNEZWZhdWx0VmVyc2lvblByb3ZpZGVyIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNCIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y0IiB2ZXJzaW9uPSIyLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjQiIHZlcnNpb249IjMuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNCIgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZHZ0X2Y1Ij4KLSAgICAgIDxkZWZhdWx0LXZlcnNpb24gcHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkRlZmF1bHRWZXJzaW9uVGVzdHMkRmFjZXREdnRGNURlZmF1bHRWZXJzaW9uUHJvdmlkZXIiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y1IiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjUiIHZlcnNpb249IjIuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNSIgdmVyc2lvbj0iMy4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y1IiB2ZXJzaW9uPSI0LjAiLz4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJkdnRfZjYiPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiBwcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRGVmYXVsdFZlcnNpb25UZXN0cyRGYWNldER2dEY2RGVmYXVsdFZlcnNpb25Qcm92aWRlciIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjYiIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNiIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y2IiB2ZXJzaW9uPSIzLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjYiIHZlcnNpb249IjQuMCIvPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImR2dF9mNyI+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjUuMCIvPgotICAgIDwvcHJvamVjdC1mYWNldD4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjciIHZlcnNpb249IjEuMCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImR2dF9mNyIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZHZ0X2Y3IiB2ZXJzaW9uPSIzLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJkdnRfZjciIHZlcnNpb249IjQuMCIvPgotCi0gIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gRmFjZXRBY3Rpb25FeGVjdXRpb25UZXN0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJmYXRfZjEiLz4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJmYXRfZjEiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkZhY2V0QWN0aW9uc1Rlc3RzJEYxdjFJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImZhdF9mMSIgdmVyc2lvbj0iMi4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRmFjZXRBY3Rpb25zVGVzdHMkRjF2Mkluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPCEtLSBVSSBUZXN0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJ1aV9sb25nX2xhYmVsMSI+Ci0gICAgICA8bGFiZWw+VGhpcyBmYWNldCBoYXMgYSByZWFsbHkgcmVhbGx5IHJhdGhlciBsb25nIGxhYmVsPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5BbmQgYSBzaG9ydCBkZXNjcmlwdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldD4gCi0gIAotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9InVpX2xvbmdfbGFiZWwxIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8Y2F0ZWdvcnkgaWQ9InVpX2xvbmdfbGFiZWxfY2F0ZWdvcnkiPgotICAgICAgPGxhYmVsPkNhdGVnb3J5IGZvciBmYWNldHMgd2l0aCBsb25nIGxhYmVsczwvbGFiZWw+Ci0gICAgPC9jYXRlZ29yeT4KLQotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJ1aV9sb25nX2xhYmVsMiI+Ci0gICAgICA8bGFiZWw+VGhpcyBmYWNldCBoYXMgYSByZWFsbHkgcmVhbGx5IHJhdGhlciBsb25nIGxhYmVsPC9sYWJlbD4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9InVpX2xvbmdfbGFiZWxfY2F0ZWdvcnkiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+IAotICAKLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJ1aV9sb25nX2xhYmVsMiIgdmVyc2lvbj0iMS4yLjMuNC41LjYuNy44LjkiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJ1aV9sb25nX2xhYmVsMiIgdmVyc2lvbj0iOS44LjcuNi41LjQuMy4yLjEiPgotICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPCEtLSBFdmVudERlbGl2ZXJ5VGVzdHMgLS0+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZWR0X2YxIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2YxIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjEiIHZlcnNpb249IjIuMCIvPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMSIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YxIiB0eXBlPSJVTklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMSIgdHlwZT0iVkVSU0lPTl9DSEFOR0UiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImVkdF9mMiIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mMiIgdmVyc2lvbj0iMS4xIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2YyIiB2ZXJzaW9uPSIyLjEiLz4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjIiIHR5cGU9IklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMiIgdHlwZT0iVU5JTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjIiIHR5cGU9IlZFUlNJT05fQ0hBTkdFIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgICA8cHJvamVjdC1mYWNldCBpZD0iZWR0X2YzIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2YzIiB2ZXJzaW9uPSIxLjIiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJlZHRfZjMiIHZlcnNpb249IjIuMiIvPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMyIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgPGFjdGlvbiBmYWNldD0iZWR0X2YzIiB0eXBlPSJVTklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mMyIgdHlwZT0iVkVSU0lPTl9DSEFOR0UiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9ImVkdF9mNCIvPgotICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImVkdF9mNCIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iZWR0X2Y0IiB2ZXJzaW9uPSIyLjMiLz4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjQiIHR5cGU9IklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotICAgIDxhY3Rpb24gZmFjZXQ9ImVkdF9mNCIgdHlwZT0iVU5JTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICA8YWN0aW9uIGZhY2V0PSJlZHRfZjQiIHR5cGU9IlZFUlNJT05fQ0hBTkdFIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saXN0ZW5lcnMiPgotICAgIDxsaXN0ZW5lciAKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5FdmVudERlbGl2ZXJ5VGVzdHMkRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIiLz4KLSAgICA8bGlzdGVuZXIgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuRXZlbnREZWxpdmVyeVRlc3RzJFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyIgotICAgICAgZXZlbnRUeXBlcz0iUFJFX0lOU1RBTEwsRklYRURfRkFDRVRTX0NIQU5HRUQiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPCEtLSBQcm9qZWN0Q3JlYXRpb25UZXN0cyAtLT4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gIAotICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJwY3QtZjEiLz4KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJwY3QtZjEiIHZlcnNpb249IjEuMCIvPgotICAgIDxhY3Rpb24gZmFjZXQ9InBjdC1mMSIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgPC9hY3Rpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0icGN0LWYyIi8+Ci0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0icGN0LWYyIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8YWN0aW9uIGZhY2V0PSJwY3QtZjIiIHR5cGU9IklOU1RBTEwiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0Lk5vT3BEZWxlZ2F0ZSIvPgotICAgIDwvYWN0aW9uPgotCi0gIDwvZXh0ZW5zaW9uPgotICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcmVzb3VyY2VzL0V2ZW50RGVsaXZlcnlUZXN0cy50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcmVzb3VyY2VzL0V2ZW50RGVsaXZlcnlUZXN0cy50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTNiMDMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Jlc291cmNlcy9FdmVudERlbGl2ZXJ5VGVzdHMudGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5idWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5uYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Jlc291cmNlcy9FdmVudERlbGl2ZXJ5VGVzdHMudGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcmVzb3VyY2VzL0V2ZW50RGVsaXZlcnlUZXN0cy50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjY2M1MjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvcmVzb3VyY2VzL0V2ZW50RGVsaXZlcnlUZXN0cy50ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmFjZXRlZC1wcm9qZWN0PgotICA8aW5zdGFsbGVkIGZhY2V0PSJlZHRfZjEiIHZlcnNpb249IjEuMCIvPgotICA8aW5zdGFsbGVkIGZhY2V0PSJlZHRfZjIiIHZlcnNpb249IjEuMSIvPgotPC9mYWNldGVkLXByb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQWJzdHJhY3RUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0Fic3RyYWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5NzAzZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQWJzdHJhY3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9URVNUX1BST0pFQ1RfTkFNRSA9ICJ0ZXN0UHJvamVjdCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8SVJlc291cmNlPiByZXNvdXJjZXNUb0NsZWFudXAgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8UnVubmFibGU+IHRlYXJEb3duT3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UnVubmFibGU+KCk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkKLSAgICAgICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZm9yKCBJUmVzb3VyY2UgciA6IHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwICkKLSAgICAgICAgewotICAgICAgICAgICAgci5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBSdW5uYWJsZSBydW5uYWJsZSA6IHRoaXMudGVhckRvd25PcGVyYXRpb25zICkKLSAgICAgICAgewotICAgICAgICAgICAgcnVubmFibGUucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUmVzb3VyY2VUb0NsZWFudXAoIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSApCi0gICAgewotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHJlc291cmNlICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFRlYXJEb3duT3BlcmF0aW9uKCBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSApCi0gICAgewotICAgICAgICB0aGlzLnRlYXJEb3duT3BlcmF0aW9ucy5hZGQoIHJ1bm5hYmxlICk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBJRmFjZXRlZFByb2plY3QgY3JlYXRlRmFjZXRlZFByb2plY3QoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGYWNldGVkUHJvamVjdCggREVGQVVMVF9URVNUX1BST0pFQ1RfTkFNRSApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCBmaW5hbCBTdHJpbmcgbmFtZSApCi0KLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoIG5hbWUgKS5leGlzdHMoKSApOwotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBuYW1lLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gZnBqLmdldFByb2plY3QoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggcGouZXhpc3RzKCkgKTsKLSAgICAgICAgYWRkUmVzb3VyY2VUb0NsZWFudXAoIHBqICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZnBqOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTE1YjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiQWxsIEZhY2V0ZWQgUHJvamVjdCBGcmFtZXdvcmsgVGVzdHMiICk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBCYXNpY1Rlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggUHJlc2V0c1Rlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggUHJvamVjdENyZWF0aW9uVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBGYWNldEFjdGlvblNvcnRUZXN0cy5zdWl0ZSgpICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEZhY2V0QWN0aW9uc1Rlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBGYWNldENvbnN0cmFpbnRzVGVzdHMuc3VpdGUoKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBEZWZhdWx0VmVyc2lvblRlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggRXZlbnREZWxpdmVyeVRlc3RzLnN1aXRlKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9CYXNpY0ZhY2V0QWN0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9CYXNpY0ZhY2V0QWN0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjZTY0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQmFzaWNGYWNldEFjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlsczsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQmFzaWNGYWNldEFjdGlvblRlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVF9OQU1FID0gInRlc3RQcm9qZWN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElGaWxlIGZhY2V0MUFydGlmYWN0RmlsZQotICAgICAgICA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCBURVNUX1BST0pFQ1RfTkFNRSApLmdldEZpbGUoICJmYWNldDEudHh0IiApOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTIxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjIwOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDEiICk7Ci0gICAgICAgICAgICBmMXYxMCA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmMXYxMiA9IGYxLmdldFZlcnNpb24oICIxLjIiICk7Ci0gICAgICAgICAgICBmMXYxMjEgPSBmMS5nZXRWZXJzaW9uKCAiMS4yLjEiICk7Ci0gICAgICAgICAgICBmMXYxMyA9IGYxLmdldFZlcnNpb24oICIxLjMiICk7Ci0gICAgICAgICAgICBmMXYyMCA9IGYxLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWdub3JlIGZhaWx1cmVzLiBUaGlzIGFwaSBpcyB0ZXN0ZWQgZXhwbGljaXRseS4KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElGYWNldGVkUHJvamVjdCBmcGo7Ci0gICAgCi0gICAgcHJpdmF0ZSBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiQmFzaWMgRmFjZXQgQWN0aW9uIFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRJbnN0YWxsMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0SW5zdGFsbDIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RGYWNldEluc3RhbGwzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRVbmluc3RhbGwxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRVbmluc3RhbGwyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRVbmluc3RhbGwzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY0ZhY2V0QWN0aW9uVGVzdHMoICJ0ZXN0RmFjZXRWZXJzaW9uQ2hhbmdlMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNGYWNldEFjdGlvblRlc3RzKCAidGVzdEZhY2V0VmVyc2lvbkNoYW5nZTIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljRmFjZXRBY3Rpb25UZXN0cyggInRlc3RBY3Rpb25TZXJpZXMiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggVEVTVF9QUk9KRUNUX05BTUUgKS5leGlzdHMoKSApOwotICAgICAgICB0aGlzLmZwaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggVEVTVF9QUk9KRUNUX05BTUUsIG51bGwsIG51bGwgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnBqLmdldFByb2plY3QoKS5leGlzdHMoKSApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouZ2V0UHJvamVjdCgpLmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRJbnN0YWxsMSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEwLCBudWxsLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTAuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldEluc3RhbGwyKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTIxLCBudWxsLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTIxLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZXRJbnN0YWxsMygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYyMCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYyMC5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0VW5pbnN0YWxsMSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEwLCBudWxsLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLnVuaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTAsIG51bGwsIG51bGwgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGZhY2V0MUFydGlmYWN0RmlsZS5leGlzdHMoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldFVuaW5zdGFsbDIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMjEsIG51bGwsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoudW5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMjEsIG51bGwsIG51bGwgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGZhY2V0MUFydGlmYWN0RmlsZS5leGlzdHMoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNldFVuaW5zdGFsbDMoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYyMCwgbnVsbCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai51bmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjIwLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmYWNldDFBcnRpZmFjdEZpbGUuZXhpc3RzKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0VmVyc2lvbkNoYW5nZTEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMCwgbnVsbCwgbnVsbCApOwotICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEyMSwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMjEuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2V0VmVyc2lvbkNoYW5nZTIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0aGlzLmZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxMywgbnVsbCwgbnVsbCApOwotICAgICAgICBmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEyLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEyLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uU2VyaWVzKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBBY3Rpb24gYWN0aW9uOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MTAsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTAuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjF2MTIsIG51bGwgKTsKLSAgICAgICAgdGhpcy5mcGoubW9kaWZ5KCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFjdGlvbiApLCBudWxsICk7Ci0gICAgICAgIFRlc3RVdGlscy5hc3NlcnRFcXVhbHMoIGZhY2V0MUFydGlmYWN0RmlsZSwgZjF2MTIuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0KLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEyMSwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMjEuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0KLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEzLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEzLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjIwLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjIwLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVU5JTlNUQUxMLCBmMXYyMCwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGZhY2V0MUFydGlmYWN0RmlsZS5leGlzdHMoKSApOwotCi0gICAgICAgIGFjdGlvbiA9IG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjEyLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEyLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEzLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEzLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEwLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjEwLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjIwLCBudWxsICk7Ci0gICAgICAgIHRoaXMuZnBqLm1vZGlmeSggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhY3Rpb24gKSwgbnVsbCApOwotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RXF1YWxzKCBmYWNldDFBcnRpZmFjdEZpbGUsIGYxdjIwLmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjEyMSwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgVGVzdFV0aWxzLmFzc2VydEVxdWFscyggZmFjZXQxQXJ0aWZhY3RGaWxlLCBmMXYxMjEuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb24gPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5VTklOU1RBTEwsIGYxdjEyMSwgbnVsbCApOwotICAgICAgICB0aGlzLmZwai5tb2RpZnkoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYWN0aW9uICksIG51bGwgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGZhY2V0MUFydGlmYWN0RmlsZS5leGlzdHMoKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9CYXNpY1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvQmFzaWNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDc3NjlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9CYXNpY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMuYXNTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBCYXNpY1Rlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCAKLSAgICAgICAgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEwOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTI7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjE7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMzsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjIwOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldCBmMjsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjM1OwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2MzVhOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDc7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0N2I7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0N2M7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYyZXh0OwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJleHR2MTA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXQgZjNhOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNhdjEwOwotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNhdjIwOwotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzYjsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYnYxMDsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYnYyMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldCBmM2M7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2N2MTA7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2N2MjA7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MSIgKTsKLSAgICAgICAgICAgIGYxdjEwID0gZjEuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYxdjEyID0gZjEuZ2V0VmVyc2lvbiggIjEuMiIgKTsKLSAgICAgICAgICAgIGYxdjEyMSA9IGYxLmdldFZlcnNpb24oICIxLjIuMSIgKTsKLSAgICAgICAgICAgIGYxdjEzID0gZjEuZ2V0VmVyc2lvbiggIjEuMyIgKTsKLSAgICAgICAgICAgIGYxdjIwID0gZjEuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZjIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDIiICk7Ci0gICAgICAgICAgICBmMnYzNSA9IGYyLmdldFZlcnNpb24oICIzLjUiICk7Ci0gICAgICAgICAgICBmMnYzNWEgPSBmMi5nZXRWZXJzaW9uKCAiMy41I2EiICk7Ci0gICAgICAgICAgICBmMnY0NyA9IGYyLmdldFZlcnNpb24oICI0LjciICk7Ci0gICAgICAgICAgICBmMnY0N2IgPSBmMi5nZXRWZXJzaW9uKCAiNC43I2IiICk7Ci0gICAgICAgICAgICBmMnY0N2MgPSBmMi5nZXRWZXJzaW9uKCAiNC43I2MiICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGYyZXh0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQyZXh0IiApOwotICAgICAgICAgICAgZjJleHR2MTAgPSBmMmV4dC5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgICAgICBmM2EgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDNhIiApOwotICAgICAgICAgICAgZjNhdjEwID0gZjNhLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmM2F2MjAgPSBmM2EuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLQotICAgICAgICAgICAgZjNiID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQzYiIgKTsKLSAgICAgICAgICAgIGYzYnYxMCA9IGYzYi5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjNidjIwID0gZjNiLmdldFZlcnNpb24oICIyLjAiICk7Ci0KLSAgICAgICAgICAgIGYzYyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0M2MiICk7Ci0gICAgICAgICAgICBmM2N2MTAgPSBmM2MuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYzY3YyMCA9IGYzYy5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBmYWlsdXJlcy4gVGhpcyBhcGkgaXMgdGVzdGVkIGV4cGxpY2l0bHkuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBCYXNpY1Rlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkJhc2ljIFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdFByb2plY3RGYWNldEV4dGVuc2lvblBvaW50IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdFByb2plY3RGYWNldFZlcnNpb25FeHRlbnNpb25Qb2ludCIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RDYXRlZ29yeUV4dGVuc2lvblBvaW50IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBCYXNpY1Rlc3RzKCAidGVzdERlZmF1bHRWZXJzaW9uQ29tcGFyYXRvciIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RDdXN0b21WZXJzaW9uQ29tcGFyYXRvciIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RWZXJzaW9uRXhwcmVzc2lvbnMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEJhc2ljVGVzdHMoICJ0ZXN0VmVyc2lvbkV4cHJlc3Npb25zV2l0aFVua25vd25WZXJzaW9ucyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RDb25zdHJhaW50cyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgQmFzaWNUZXN0cyggInRlc3RDb25zdHJhaW50QXBpIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0RmFjZXRFeHRlbnNpb25Qb2ludCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoICJmYWNldDEiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zKCBmMSApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldElkKCksICJmYWNldDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0TGFiZWwoKSwgIkZhY2V0IDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0RGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIGZhY2V0MS4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoICJmYWNldDIiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmMiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MiIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zKCBmMiApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldElkKCksICJmYWNldDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0TGFiZWwoKSwgImZhY2V0MiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMi5nZXREZXNjcmlwdGlvbigpLCAiIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdEZhY2V0VmVyc2lvbkV4dGVuc2lvblBvaW50KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxLmhhc1ZlcnNpb24oICIxLjAiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTAgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEwLmdldFZlcnNpb25TdHJpbmcoKSwgIjEuMCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMC5nZXRQcm9qZWN0RmFjZXQoKSwgZjEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMC5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMS5oYXNWZXJzaW9uKCAiMS4yIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyID0gZjEuZ2V0VmVyc2lvbiggIjEuMiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMi5nZXRWZXJzaW9uU3RyaW5nKCksICIxLjIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTIuZ2V0UHJvamVjdEZhY2V0KCksIGYxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTIuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEuaGFzVmVyc2lvbiggIjEuMi4xIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEyMSA9IGYxLmdldFZlcnNpb24oICIxLjIuMSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMjEuZ2V0VmVyc2lvblN0cmluZygpLCAiMS4yLjEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTIxLmdldFByb2plY3RGYWNldCgpLCBmMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjEyMS5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMS5oYXNWZXJzaW9uKCAiMS4zIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEzID0gZjEuZ2V0VmVyc2lvbiggIjEuMyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMXYxMy5nZXRWZXJzaW9uU3RyaW5nKCksICIxLjMiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTMuZ2V0UHJvamVjdEZhY2V0KCksIGYxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MTMuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEuaGFzVmVyc2lvbiggIjIuMCIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYyMCA9IGYxLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjF2MjAuZ2V0VmVyc2lvblN0cmluZygpLCAiMi4wIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjIwLmdldFByb2plY3RGYWNldCgpLCBmMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxdjIwLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucygpLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMCwgZjF2MTIsIGYxdjEyMSwgZjF2MTMsIGYxdjIwICkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMi5oYXNWZXJzaW9uKCAiMy41IiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjM1ID0gZjIuZ2V0VmVyc2lvbiggIjMuNSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnYzNS5nZXRWZXJzaW9uU3RyaW5nKCksICIzLjUiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2MzUuZ2V0UHJvamVjdEZhY2V0KCksIGYyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2MzUuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjIuaGFzVmVyc2lvbiggIjMuNSNhIiApICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjM1YSA9IGYyLmdldFZlcnNpb24oICIzLjUjYSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnYzNWEuZ2V0VmVyc2lvblN0cmluZygpLCAiMy41I2EiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2MzVhLmdldFByb2plY3RGYWNldCgpLCBmMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjM1YS5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGYyLmhhc1ZlcnNpb24oICI0LjciICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDcgPSBmMi5nZXRWZXJzaW9uKCAiNC43IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3LmdldFZlcnNpb25TdHJpbmcoKSwgIjQuNyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0Ny5nZXRQcm9qZWN0RmFjZXQoKSwgZjIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0Ny5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBmMi5oYXNWZXJzaW9uKCAiNC43I2IiICkgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDdiID0gZjIuZ2V0VmVyc2lvbiggIjQuNyNiIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3Yi5nZXRWZXJzaW9uU3RyaW5nKCksICI0LjcjYiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0N2IuZ2V0UHJvamVjdEZhY2V0KCksIGYyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDdiLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYyLmhhc1ZlcnNpb24oICI0LjcjYyIgKSApOwotICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnY0N2MgPSBmMi5nZXRWZXJzaW9uKCAiNC43I2MiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjJ2NDdjLmdldFZlcnNpb25TdHJpbmcoKSwgIjQuNyNjIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYydjQ3Yy5nZXRQcm9qZWN0RmFjZXQoKSwgZjIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMnY0N2MuZ2V0UGx1Z2luSWQoKSwgUExVR0lOX0lEICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldFZlcnNpb25zKCksIAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMnYzNSwgZjJ2MzVhLCBmMnY0NywgZjJ2NDdiLCBmMnY0N2MgKSApOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIHZlcnNpb24gdGhhdCBkb2Vzbid0IGV4aXN0LgotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYyLmhhc1ZlcnNpb24oICI2LjkiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmMi5nZXRWZXJzaW9uKCAiNi45IiApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApIHt9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yeUV4dGVuc2lvblBvaW50KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzQ2F0ZWdvcnlEZWZpbmVkKCAiY2F0MSIgKSApOwotICAgICAgICBmaW5hbCBJQ2F0ZWdvcnkgY2F0MSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldENhdGVnb3J5KCAiY2F0MSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0Q2F0ZWdvcmllcygpLmNvbnRhaW5zKCBjYXQxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggY2F0MS5nZXRJZCgpLCAiY2F0MSIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQxLmdldExhYmVsKCksICJDYXRlZ29yeSAxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDEuZ2V0RGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIGNhdGVnb3J5IGRlc2NyaXB0aW9uLiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQxLmdldFBsdWdpbklkKCksIFBMVUdJTl9JRCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggY2F0MS5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMiwgZjJleHQgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldENhdGVnb3J5KCksIGNhdDEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMmV4dC5nZXRDYXRlZ29yeSgpLCBjYXQxICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc0NhdGVnb3J5RGVmaW5lZCggImNhdDIiICkgKTsKLSAgICAgICAgZmluYWwgSUNhdGVnb3J5IGNhdDIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRDYXRlZ29yeSggImNhdDIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldENhdGVnb3JpZXMoKS5jb250YWlucyggY2F0MiApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGNhdDIuZ2V0SWQoKSwgImNhdDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggY2F0Mi5nZXRMYWJlbCgpLCAiY2F0MiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjYXQyLmdldERlc2NyaXB0aW9uKCksICIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggY2F0Mi5nZXRQbHVnaW5JZCgpLCBQTFVHSU5fSUQgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggY2F0Mi5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmM2EsIGYzYiwgZjNjICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmM2EuZ2V0Q2F0ZWdvcnkoKSwgY2F0MiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGYzYi5nZXRDYXRlZ29yeSgpLCBjYXQyICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjNjLmdldENhdGVnb3J5KCksIGNhdDIgKTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZlcnNpb25Db21wYXJhdG9yKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gY29tcCA9IGYxLmdldFZlcnNpb25Db21wYXJhdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGNvbXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5EZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IiICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjAiLCAiMS4yIiApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjIiLCAiMS4yLjEiICkgPCAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMi4xIiwgIjIuMCIgKSA8IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMiIsICIxLjAiICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMi4xIiwgIjEuMiIgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMi4wIiwgIjEuMi4xIiApID4gMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMS4wIiwgIjEuMCIgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjEuMiIsICIxLjIiICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIxLjIuMSIsICIxLjIuMSIgKSA9PSAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjIuMCIsICIyLjAiICkgPT0gMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTAuY29tcGFyZVRvKCBmMXYxMiApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMi5jb21wYXJlVG8oIGYxdjEyMSApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMjEuY29tcGFyZVRvKCBmMXYyMCApIDwgMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTIuY29tcGFyZVRvKCBmMXYxMCApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMXYxMjEuY29tcGFyZVRvKCBmMXYxMiApID4gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMXYyMC5jb21wYXJlVG8oIGYxdjEyMSApID4gMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTAuY29tcGFyZVRvKCBmMXYxMCApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTIuY29tcGFyZVRvKCBmMXYxMiApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjF2MTIxLmNvbXBhcmVUbyggZjF2MTIxICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMXYyMC5jb21wYXJlVG8oIGYxdjIwICkgPT0gMCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0TGF0ZXN0VmVyc2lvbigpLCBmMXYyMCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdCBhc2MgPSBmMS5nZXRTb3J0ZWRWZXJzaW9ucyggdHJ1ZSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2Muc2l6ZSgpLCA1ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMCApLCBmMXYxMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDEgKSwgZjF2MTIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAyICksIGYxdjEyMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5nZXQoIDMgKSwgZjF2MTMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCA0ICksIGYxdjIwICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0IGRlc2MgPSBmMS5nZXRTb3J0ZWRWZXJzaW9ucyggZmFsc2UgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5zaXplKCksIDUgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMCApLCBmMXYyMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2MuZ2V0KCAxICksIGYxdjEzICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDIgKSwgZjF2MTIxICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDMgKSwgZjF2MTIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggNCApLCBmMXYxMCApOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVZlcnNpb25Db21wYXJhdG9yKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gY29tcCA9IGYyLmdldFZlcnNpb25Db21wYXJhdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGNvbXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LkN1c3RvbVZlcnNpb25Db21wYXJhdG9yIiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMy41IiwgIjQuNyIgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMy41IiwgIjMuNSNhIiApIDwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICI0LjcjYyIsICI0LjcjYiIgKSA8IDAgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjQuNyIsICIzLjUiICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGNvbXAuY29tcGFyZSggIjMuNSNhIiwgIjMuNSIgKSA+IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiNC43I2IiLCAiNC43I2MiICkgPiAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICIzLjUiLCAiMy41IiApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiMy41I2EiLCAiMy41I2EiICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBjb21wLmNvbXBhcmUoICI0LjciLCAiNC43IiApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggY29tcC5jb21wYXJlKCAiNC43I2IiLCAiNC43I2IiICkgPT0gMCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGYydjM1LmNvbXBhcmVUbyggZjJ2NDcgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzUuY29tcGFyZVRvKCBmMnYzNWEgKSA8IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdjLmNvbXBhcmVUbyggZjJ2NDdiICkgPCAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0Ny5jb21wYXJlVG8oIGYydjM1ICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjM1YS5jb21wYXJlVG8oIGYydjM1ICkgPiAwICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yi5jb21wYXJlVG8oIGYydjQ3YyApID4gMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzUuY29tcGFyZVRvKCBmMnYzNSApID09IDAgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzVhLmNvbXBhcmVUbyggZjJ2MzVhICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0Ny5jb21wYXJlVG8oIGYydjQ3ICkgPT0gMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2IuY29tcGFyZVRvKCBmMnY0N2IgKSA9PSAwICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYyLmdldExhdGVzdFZlcnNpb24oKSwgZjJ2NDdiICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0IGFzYyA9IGYyLmdldFNvcnRlZFZlcnNpb25zKCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzYy5zaXplKCksIDUgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAwICksIGYydjM1ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMSApLCBmMnYzNWEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCAyICksIGYydjQ3ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYXNjLmdldCggMyApLCBmMnY0N2MgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc2MuZ2V0KCA0ICksIGYydjQ3YiApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdCBkZXNjID0gZjIuZ2V0U29ydGVkVmVyc2lvbnMoIGZhbHNlICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGRlc2Muc2l6ZSgpLCA1ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDAgKSwgZjJ2NDdiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDEgKSwgZjJ2NDdjICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZGVzYy5nZXQoIDIgKSwgZjJ2NDcgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggMyApLCBmMnYzNWEgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkZXNjLmdldCggNCApLCBmMnYzNSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbkV4cHJlc3Npb25zKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiMS4yIiApLCAKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjEuMiwxLjMiICksIAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMiwgZjF2MTMgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjEuMCwxLjIsMS4yLjEsMS4zLDIuMCIgKSwgCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEwLCBmMXYxMiwgZjF2MTIxLCBmMXYxMywgZjF2MjAgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIlsxLjIiICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEyLCBmMXYxMjEsIGYxdjEzLCBmMXYyMCApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiKDEuMiIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIxLCBmMXYxMywgZjF2MjAgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjEuM10iICksCi0gICAgICAgICAgICAgICAgICAgICAgYXNTZXQoIGYxdjEwLCBmMXYxMiwgZjF2MTIxLCBmMXYxMyApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiMS4zKSIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTAsIGYxdjEyLCBmMXYxMjEgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIlsxLjItMS4zXSIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIsIGYxdjEyMSwgZjF2MTMgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIlsxLjItMS4zKSIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTIsIGYxdjEyMSApICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldFZlcnNpb25zKCAiKDEuMi0xLjNdIiApLAotICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMjEsIGYxdjEzICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICIxLjAsKDEuMi0xLjNdLDIuMCIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MTAsIGYxdjEyMSwgZjF2MTMsIGYxdjIwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNhc2VzIHdoZXJlIHZlcnNpb24gZXhwcmVzc2lvbnMgbWFrZSByZWZlcmVuY2VzIHRvIGZhY2V0IHZlcnNpb25zIHRoYXQgZG9uJ3QKLSAgICAgKiBhY3R1YWxseSBleGlzdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbkV4cHJlc3Npb25zV2l0aFVua25vd25WZXJzaW9ucygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIlswLjUtMS4yXSIgKSwgYXNTZXQoIGYxdjEwLCBmMXYxMiApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICJbMS4yLjItMi4wXSIgKSwgYXNTZXQoIGYxdjEzLCBmMXYyMCApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICJbMC41LTEwLjApIiApLCBhc1NldCggZjF2MTAsIGYxdjEyLCBmMXYxMjEsIGYxdjEzLCBmMXYyMCApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjEuZ2V0VmVyc2lvbnMoICJbMTAuMC0yNV0iICksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjMuMCw0LjUiICksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmMS5nZXRWZXJzaW9ucyggIjUuNyIgKSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSApOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW50cygpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBWZXJzaW9uOiAzLjUKLSAgICAgICAgICogCi0gICAgICAgICAqIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgICAgICovIAotCi0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNS5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnYzNS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMiApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNS5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMjEgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzUuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTMgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzUuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAgKSApLmlzT0soKSApOwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogVmVyc2lvbjogMy41I2EKLSAgICAgICAgICogCi0gICAgICAgICAqIDxhbmQ+Ci0gICAgICAgICAqICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IlsxLjItMS4zKSIvPgotICAgICAgICAgKiA8L2FuZD4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzVhLmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzVhLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzVhLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2MzVhLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyMSApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnYzNWEuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTMgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2MzVhLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFZlcnNpb246IDQuNwotICAgICAgICAgKiAKLSAgICAgICAgICogPG9yPgotICAgICAgICAgKiAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSJbMS4zIi8+Ci0gICAgICAgICAqIDwvb3I+Ci0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3LmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDcuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDcuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDcuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIxICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDcuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTMgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0Ny5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBWZXJzaW9uOiA0LjcjYgotICAgICAgICAgKiAKLSAgICAgICAgICogPG9yPgotICAgICAgICAgKiAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjMiLz4KLSAgICAgICAgICogICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgICAgICAqIDwvb3I+Ci0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yi5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCAgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yi5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2IuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggZjJ2NDdiLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEyMSApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yi5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yi5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBWZXJzaW9uOiA0LjcjYwotICAgICAgICAgKiAKLSAgICAgICAgICogPGFuZD4KLSAgICAgICAgICogICA8b3I+Ci0gICAgICAgICAqICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4yLjEiLz4KLSAgICAgICAgICogICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIxLjMiLz4KLSAgICAgICAgICogICAgIDxyZXF1aXJlcyBmYWNldD0iZmFjZXQxIiB2ZXJzaW9uPSIyLjAiLz4KLSAgICAgICAgICogICA8L29yPgotICAgICAgICAgKiAgIDxjb25mbGljdHMgZmFjZXQ9ImZhY2V0M2EiLz4KLSAgICAgICAgICogICA8Y29uZmxpY3RzIGZhY2V0PSJmYWNldDNiIiB2ZXJzaW9uPSIxLjAiLz4KLSAgICAgICAgICogICA8Y29uZmxpY3RzIGdyb3VwPSJncm91cDEiLz4KLSAgICAgICAgICogPC9hbmQ+Ci0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCAgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTIxICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjEzICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjJ2NDdjLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGYxdjIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAsIGYzYXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAsIGYzYXYyMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMnY0N2MuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MjAsIGYzYnYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCwgZjNidjIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCwgZjNjdjEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYydjQ3Yy5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmMXYyMCwgZjNjdjIwICkgKS5pc09LKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cmFpbnRBcGkoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBJQ29uc3RyYWludC5UeXBlLkFORC5uYW1lKCksICJhbmQiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggImFuZCIgKSA9PSBJQ29uc3RyYWludC5UeXBlLkFORCApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJhTmQiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5BTkQgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggSUNvbnN0cmFpbnQuVHlwZS5PUi5uYW1lKCksICJvciIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAib3IiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5PUiApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJvUiIgKSA9PSBJQ29uc3RyYWludC5UeXBlLk9SICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMubmFtZSgpLCAicmVxdWlyZXMiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggInJlcXVpcmVzIiApID09IElDb25zdHJhaW50LlR5cGUuUkVRVUlSRVMgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggSUNvbnN0cmFpbnQuVHlwZS52YWx1ZU9mKCAickVxVWlSZXMiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUyApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBJQ29uc3RyYWludC5UeXBlLkNPTkZMSUNUUy5uYW1lKCksICJjb25mbGljdHMiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIElDb25zdHJhaW50LlR5cGUudmFsdWVPZiggImNvbmZsaWN0cyIgKSA9PSBJQ29uc3RyYWludC5UeXBlLkNPTkZMSUNUUyApOwotICAgICAgICBhc3NlcnRUcnVlKCBJQ29uc3RyYWludC5UeXBlLnZhbHVlT2YoICJjT25GbEljVHMiICkgPT0gSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMgKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIDxhbmQ+Ci0gICAgICAgICAqICAgPG9yPgotICAgICAgICAgKiAgICAgPHJlcXVpcmVzIGZhY2V0PSJmYWNldDEiIHZlcnNpb249IjEuMi4xIi8+Ci0gICAgICAgICAqICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICAgICAqICAgICA8cmVxdWlyZXMgZmFjZXQ9ImZhY2V0MSIgdmVyc2lvbj0iMi4wIi8+Ci0gICAgICAgICAqICAgPC9vcj4KLSAgICAgICAgICogICA8Y29uZmxpY3RzIGZhY2V0PSJmYWNldDNhIi8+Ci0gICAgICAgICAqICAgPGNvbmZsaWN0cyBmYWNldD0iZmFjZXQzYiIgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICAgICAqICAgPGNvbmZsaWN0cyBncm91cD0iZ3JvdXAxIi8+Ci0gICAgICAgICAqIDwvYW5kPgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzR3JvdXBEZWZpbmVkKCAiZ3JvdXAxIiApICk7Ci0gICAgICAgIGZpbmFsIElHcm91cCBnID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0R3JvdXAoICJncm91cDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZy5nZXRJZCgpLCAiZ3JvdXAxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGcuZ2V0TWVtYmVycygpLCBhc1NldCggZjJ2NDdjLCBmM2N2MTAsIGYzY3YyMCApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ29uc3RyYWludCByb290ID0gZjJ2NDdjLmdldENvbnN0cmFpbnQoKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCByb290LCBJQ29uc3RyYWludC5UeXBlLkFORCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgSUNvbnN0cmFpbnQgYzEsIGMyOwotICAgICAgICAKLSAgICAgICAgYzEgPSAoSUNvbnN0cmFpbnQpIHJvb3QuZ2V0T3BlcmFuZCggMCApOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMxLCBJQ29uc3RyYWludC5UeXBlLk9SLCBudWxsLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBjMiA9IChJQ29uc3RyYWludCkgYzEuZ2V0T3BlcmFuZCggMCApOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMyLCBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTLCBmMSwgIjEuMi4xIiwgQm9vbGVhbi5GQUxTRSApOwotICAgICAgICAKLSAgICAgICAgYzIgPSAoSUNvbnN0cmFpbnQpIGMxLmdldE9wZXJhbmQoIDEgKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjMiwgSUNvbnN0cmFpbnQuVHlwZS5SRVFVSVJFUywgZjEsICIxLjMiLCBCb29sZWFuLkZBTFNFICk7Ci0gICAgICAgIAotICAgICAgICBjMiA9IChJQ29uc3RyYWludCkgYzEuZ2V0T3BlcmFuZCggMiApOwotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMyLCBJQ29uc3RyYWludC5UeXBlLlJFUVVJUkVTLCBmMSwgIjIuMCIsIEJvb2xlYW4uRkFMU0UgKTsKLSAgICAgICAgCi0gICAgICAgIGMxID0gKElDb25zdHJhaW50KSByb290LmdldE9wZXJhbmQoIDEgKTsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjMSwgSUNvbnN0cmFpbnQuVHlwZS5DT05GTElDVFMsIGYzYSwgIioiICk7Ci0gICAgICAgIAotICAgICAgICBjMSA9IChJQ29uc3RyYWludCkgcm9vdC5nZXRPcGVyYW5kKCAyICk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYzEsIElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTLCBmM2IsICIxLjAiICk7Ci0gICAgICAgIAotICAgICAgICBjMSA9IChJQ29uc3RyYWludCkgcm9vdC5nZXRPcGVyYW5kKCAzICk7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYzEsIElDb25zdHJhaW50LlR5cGUuQ09ORkxJQ1RTLCBnICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb25zdHJhaW50KCBmaW5hbCBJQ29uc3RyYWludCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludC5UeXBlIGV4cGVjdGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZCApCi0gICAgewotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMsIGV4cGVjdGVkVHlwZSwgbmV3IE9iamVjdFtdIHsgZXhwZWN0ZWRPcGVyYW5kIH0gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uc3RyYWludCggZmluYWwgSUNvbnN0cmFpbnQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbnN0cmFpbnQuVHlwZSBleHBlY3RlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMiApCi0gICAgewotICAgICAgICBjaGVja0NvbnN0cmFpbnQoIGMsIGV4cGVjdGVkVHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZXhwZWN0ZWRPcGVyYW5kMSwgZXhwZWN0ZWRPcGVyYW5kMiB9ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnN0cmFpbnQoIGZpbmFsIElDb25zdHJhaW50IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDb25zdHJhaW50LlR5cGUgZXhwZWN0ZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQzICkKLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uc3RyYWludCggYywgZXhwZWN0ZWRUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBleHBlY3RlZE9wZXJhbmQxLCBleHBlY3RlZE9wZXJhbmQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkT3BlcmFuZDMgfSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb25zdHJhaW50KCBmaW5hbCBJQ29uc3RyYWludCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludC5UeXBlIGV4cGVjdGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBleHBlY3RlZE9wZXJhbmQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWRPcGVyYW5kMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkT3BlcmFuZDQgKQotICAgIHsKLSAgICAgICAgY2hlY2tDb25zdHJhaW50KCBjLCBleHBlY3RlZFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGV4cGVjdGVkT3BlcmFuZDEsIGV4cGVjdGVkT3BlcmFuZDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRPcGVyYW5kMywgZXhwZWN0ZWRPcGVyYW5kNCB9ICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb25zdHJhaW50KCBmaW5hbCBJQ29uc3RyYWludCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ29uc3RyYWludC5UeXBlIGV4cGVjdGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gZXhwZWN0ZWRPcGVyYW5kcyApCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGMuZ2V0VHlwZSgpLCBleHBlY3RlZFR5cGUgKTsKLQotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBjLmdldE9wZXJhbmRzKCkuc2l6ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNvdW50LCBleHBlY3RlZE9wZXJhbmRzLmxlbmd0aCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvcGVyYW5kID0gYy5nZXRPcGVyYW5kKCBpICk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZXhwZWN0ZWQgPSBleHBlY3RlZE9wZXJhbmRzWyBpIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBleHBlY3RlZCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBleHBlY3RlZCBpbnN0YW5jZW9mIFN0cmluZyApICYmCi0gICAgICAgICAgICAgICAgICAgICEgKCBvcGVyYW5kIGluc3RhbmNlb2YgU3RyaW5nICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBvcGVyYW5kLnRvU3RyaW5nKCksIGV4cGVjdGVkICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyggb3BlcmFuZCwgZXhwZWN0ZWQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxpc3QuYWRkKCBjLmdldE9wZXJhbmQoIGkgKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGMuZ2V0T3BlcmFuZHMoKSwgbGlzdCApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9EZWZhdWx0VmVyc2lvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRGVmYXVsdFZlcnNpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDlmOWEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9EZWZhdWx0VmVyc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWZhdWx0VmVyc2lvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIERlZmF1bHRWZXJzaW9uVGVzdHMKLQotICAgIGV4dGVuZHMgVGVzdENhc2UKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYyOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjN2MzsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY0OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY0djQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY1OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY1djQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNnY0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmN3Y0OwotICAgIAotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjEiICk7Ci0gICAgICAgIGYxdjQgPSBmMS5nZXRWZXJzaW9uKCAiNC4wIiApOwotCi0gICAgICAgIGYyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2YyIiApOwotICAgICAgICBmMnYyID0gZjIuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLQotICAgICAgICBmMyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mMyIgKTsKLSAgICAgICAgZjN2MyA9IGYzLmdldFZlcnNpb24oICIzLjAiICk7Ci0KLSAgICAgICAgZjQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjQiICk7Ci0gICAgICAgIGY0djQgPSBmNC5nZXRWZXJzaW9uKCAiNC4wIiApOwotCi0gICAgICAgIGY1ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZHZ0X2Y1IiApOwotICAgICAgICBmNXY0ID0gZjUuZ2V0VmVyc2lvbiggIjQuMCIgKTsKLQotICAgICAgICBmNiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mNiIgKTsKLSAgICAgICAgZjZ2NCA9IGY2LmdldFZlcnNpb24oICI0LjAiICk7Ci0KLSAgICAgICAgZjcgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJkdnRfZjciICk7Ci0gICAgICAgIGY3djQgPSBmNy5nZXRWZXJzaW9uKCAiNC4wIiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIERlZmF1bHRWZXJzaW9uVGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiRGVmYXVsdCBWZXJzaW9uIFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBEZWZhdWx0VmVyc2lvblRlc3RzKCAidGVzdFVuc3BlY2lmaWVkRGVmYXVsdFZlcnNpb24iICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IERlZmF1bHRWZXJzaW9uVGVzdHMoICJ0ZXN0U3RhdGljRGVmYXVsdFZlcnNpb24iICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IERlZmF1bHRWZXJzaW9uVGVzdHMoICJ0ZXN0RGVmYXVsdFZlcnNpb25Qcm92aWRlciIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRGVmYXVsdFZlcnNpb25UZXN0cyggInRlc3RCYWREZWZhdWx0VmVyc2lvblByb3ZpZGVyMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRGVmYXVsdFZlcnNpb25UZXN0cyggInRlc3RCYWREZWZhdWx0VmVyc2lvblByb3ZpZGVyMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRGVmYXVsdFZlcnNpb25UZXN0cyggInRlc3RCYWREZWZhdWx0VmVyc2lvblByb3ZpZGVyMyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRGVmYXVsdFZlcnNpb25UZXN0cyggInRlc3RCYWREZWZhdWx0VmVyc2lvbiIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zcGVjaWZpZWREZWZhdWx0VmVyc2lvbigpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGYxLmdldERlZmF1bHRWZXJzaW9uKCksIGYxdjQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY0RlZmF1bHRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZjIuZ2V0RGVmYXVsdFZlcnNpb24oKSwgZjJ2MiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZlcnNpb25Qcm92aWRlcigpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGYzLmdldERlZmF1bHRWZXJzaW9uKCksIGYzdjMgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGhhbmRsaW5nIG9mIHRoZSBjYXNlIHdoZXJlIHRoZSBhc3NvY2lhdGVkIGRlZmF1bHQgdmVyc2lvbgotICAgICAqIHByb3ZpZGVyIHJldHVybnMgYSB2ZXJzaW9uIHRoYXQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIGZhY2V0IHRoYXQgdGhlCi0gICAgICogdmVyc2lvbiBwcm92aWRlciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRGVmYXVsdFZlcnNpb25Qcm92aWRlcjEoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmNC5nZXREZWZhdWx0VmVyc2lvbigpLCBmNHY0ICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBoYW5kbGluZyBvZiB0aGUgY2FzZSB3aGVyZSB0aGUgYXNzb2NpYXRlZCBkZWZhdWx0IHZlcnNpb24KLSAgICAgKiBwcm92aWRlciB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gaW52b2tlZC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWREZWZhdWx0VmVyc2lvblByb3ZpZGVyMigpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIGY1LmdldERlZmF1bHRWZXJzaW9uKCksIGY1djQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGhhbmRsaW5nIG9mIHRoZSBjYXNlIHdoZXJlIHRoZSBhc3NvY2lhdGVkIGRlZmF1bHQgdmVyc2lvbgotICAgICAqIHByb3ZpZGVyIHJldHVybnMgbnVsbC4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRGVmYXVsdFZlcnNpb25Qcm92aWRlcjMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmNi5nZXREZWZhdWx0VmVyc2lvbigpLCBmNnY0ICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGhhbmRsaW5nIG9mIHRoZSBjYXNlIHdoZXJlIHRoZSBzcGVjaWZpZWQgc3RhdGljIGRlZmF1bHQgdmVyc2lvbgotICAgICAqIGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZmFjZXQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRGVmYXVsdFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmNy5nZXREZWZhdWx0VmVyc2lvbigpLCBmN3Y0ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjZXREdnRGM0RlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLQotICAgICAgICBpbXBsZW1lbnRzIElEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi0gICAgICAgIAotICAgIHsKLSAgICAKLSAgICAgICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRWZXJzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImR2dF9mMyIgKS5nZXRWZXJzaW9uKCAiMy4wIiApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjZXREdnRGNURlZmF1bHRWZXJzaW9uUHJvdmlkZXIKLQotICAgICAgICBpbXBsZW1lbnRzIElEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRWZXJzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY2V0RHZ0RjZEZWZhdWx0VmVyc2lvblByb3ZpZGVyCi0KLSAgICAgICAgaW1wbGVtZW50cyBJRGVmYXVsdFZlcnNpb25Qcm92aWRlcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXREZWZhdWx0VmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0V2ZW50RGVsaXZlcnlUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0V2ZW50RGVsaXZlcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQzNjFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9FdmVudERlbGl2ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLmludGVybmFsLkZpbGVVdGlsLkZJTEVfRE9UX1BST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnV0aWwuaW50ZXJuYWwuRmlsZVV0aWwuY29weUZyb21QbHVnaW47Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrQ29yZVRlc3RzUGx1Z2luLlBMVUdJTl9JRDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMuYXNTZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0OwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCAidW51c2VkIiApCi1wdWJsaWMgZmluYWwgY2xhc3MgRXZlbnREZWxpdmVyeVRlc3RzCi0KLSAgICBleHRlbmRzIEFic3RyYWN0VGVzdHMKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjIwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYxMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYyMTsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjN2MTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjN2MjI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmNDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNHYxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmNHYyMzsKLSAgICAKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZWR0X2YxIiApOwotICAgICAgICBmMXYxMCA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgIGYxdjIwID0gZjEuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgCi0gICAgICAgIGYyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZWR0X2YyIiApOwotICAgICAgICBmMnYxMSA9IGYyLmdldFZlcnNpb24oICIxLjEiICk7Ci0gICAgICAgIGYydjIxID0gZjIuZ2V0VmVyc2lvbiggIjIuMSIgKTsKLQotICAgICAgICBmMyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImVkdF9mMyIgKTsKLSAgICAgICAgZjN2MTIgPSBmMy5nZXRWZXJzaW9uKCAiMS4yIiApOwotICAgICAgICBmM3YyMiA9IGYzLmdldFZlcnNpb24oICIyLjIiICk7Ci0KLSAgICAgICAgZjQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJlZHRfZjQiICk7Ci0gICAgICAgIGY0djEzID0gZjQuZ2V0VmVyc2lvbiggIjEuMyIgKTsKLSAgICAgICAgZjR2MjMgPSBmNC5nZXRWZXJzaW9uKCAiMi4zIiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEV2ZW50RGVsaXZlcnlUZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJFdmVudCBEZWxpdmVyeSBUZXN0cyIgKTsKLQotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRXZlbnREZWxpdmVyeVRlc3RzKCAidGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRXZlbnREZWxpdmVyeVRlc3RzKCAidGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRXZlbnREZWxpdmVyeVRlc3RzKCAidGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRXZlbnREZWxpdmVyeVRlc3RzKCAidGVzdEV2ZW50RGVsaXZlcnkiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgbm8gZmFjZXRlZCBwcm9qZWN0IGV2ZW50cyBhcmUgZGVsaXZlcmVkIHdoZW4gYSBuZXcgZmFjZXRlZCBwcm9qZWN0Ci0gICAgICogaXMgY3JlYXRlZC4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24xKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5yZXNldCgpOwotICAgICAgICBjcmVhdGVGYWNldGVkUHJvamVjdCggInRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjEiICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLnJldHJpZXZlRXZlbnRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IG5vIGZhY2V0ZWQgcHJvamVjdCBldmVudHMgYXJlIGRlbGl2ZXJlZCB3aGVuIGFuIGV4aXN0aW5nIGZhY2V0ZWQgCi0gICAgICogcHJvamVjdCBpcyBpbXBvcnRlZCBpbnRvIHRoZSB3b3Jrc3BhY2UgYW5kIHRoZSBmYWNldGVkIHByb2plY3Qgd3JhcHBlciBpcyBjcmVhdGVkLiBJbiB0aGlzCi0gICAgICogc2NlbmFyaW8gdmFyaWFudCwgdGhlIGltcG9ydGVkIHByb2plY3Qgd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBhbmQgdGhlbiByZW1vdmVkIGZyb20gdGhlCi0gICAgICogd29ya3NwYWNlIGluIHRoZSBzYW1lIHdvcmtiZW5jaCBzZXNzaW9uLiAKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGogCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggInRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjIiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdCBwaiA9IGZwai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGFkZFJlc291cmNlVG9DbGVhbnVwKCBwaiApOwotICAgICAgICAKLSAgICAgICAgZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEwLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMnYxMSwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgcGouZGVsZXRlKCBmYWxzZSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLnJlc2V0KCk7Ci0gICAgICAgIAotICAgICAgICBwai5jcmVhdGUoIG51bGwgKTsKLSAgICAgICAgcGoub3BlbiggbnVsbCApOwotCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGpOZXcgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHBqICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBmcGpOZXcuaGFzUHJvamVjdEZhY2V0KCBmMXYxMCApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGZwak5ldy5oYXNQcm9qZWN0RmFjZXQoIGYydjExICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5yZXRyaWV2ZUV2ZW50cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcGogIT0gZnBqTmV3ICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IG5vIGZhY2V0ZWQgcHJvamVjdCBldmVudHMgYXJlIGRlbGl2ZXJlZCB3aGVuIGFuIGV4aXN0aW5nIGZhY2V0ZWQgCi0gICAgICogcHJvamVjdCBpcyBpbXBvcnRlZCBpbnRvIHRoZSB3b3Jrc3BhY2UgYW5kIHRoZSBmYWNldGVkIHByb2plY3Qgd3JhcHBlciBpcyBjcmVhdGVkLiBJbiB0aGlzCi0gICAgICogc2NlbmFyaW8gdmFyaWFudCwgbm8gcHJvamVjdCB3aXRoIHRoYW4gbmFtZSBoYXMgZXhpc3RlZCBpbiB0aGUgd29ya3NwYWNlIGluIHRoaXMgd29ya2JlbmNoCi0gICAgICogc2Vzc2lvbi4gCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50c0F0UHJvamVjdENyZWF0aW9uMygpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIucmVzZXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgd3NMb2NhdGlvbiA9IHdzUm9vdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHBqTmFtZSA9ICJ0ZXN0RXZlbnRzQXRQcm9qZWN0Q3JlYXRpb24zIjsKLSAgICAgICAgZmluYWwgRmlsZSBwakxvY2F0aW9uID0gbmV3IEZpbGUoIHdzTG9jYXRpb24sIHBqTmFtZSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc1ByZWZpeCA9ICJyZXNvdXJjZXMvRXZlbnREZWxpdmVyeVRlc3RzLnRlc3RFdmVudHNBdFByb2plY3RDcmVhdGlvbjMvIjsKLSAgICAgICAgCi0gICAgICAgIGNvcHlGcm9tUGx1Z2luKCBQTFVHSU5fSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgoIHJlc1ByZWZpeCArIEZJTEVfRE9UX1BST0pFQ1QgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCBwakxvY2F0aW9uLCBGSUxFX0RPVF9QUk9KRUNUICkgKTsKLSAgICAgICAgCi0gICAgICAgIGNvcHlGcm9tUGx1Z2luKCBQTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGF0aCggcmVzUHJlZml4ICsgRmFjZXRlZFByb2plY3QuTUVUQURBVEFfRklMRSApLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIHBqTG9jYXRpb24sIEZhY2V0ZWRQcm9qZWN0Lk1FVEFEQVRBX0ZJTEUgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcGogPSB3c1Jvb3QuZ2V0UHJvamVjdCggcGpOYW1lICk7Ci0gICAgICAgIAotICAgICAgICBwai5jcmVhdGUoIG51bGwgKTsKLSAgICAgICAgcGoub3BlbiggbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYWRkUmVzb3VyY2VUb0NsZWFudXAoIHBqICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwaiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnBqLmhhc1Byb2plY3RGYWNldCggZjF2MTAgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcGouaGFzUHJvamVjdEZhY2V0KCBmMnYxMSApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIucmV0cmlldmVFdmVudHMoKS5zaXplKCksIDAgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50RGVsaXZlcnkoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdC4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGogPSBjcmVhdGVGYWNldGVkUHJvamVjdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gU2V0dXAgbGlzdGVuZXJzLgotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdGVuZXIgZnVsbExpc3RlbmVyUHJvamVjdEFwaSA9IG5ldyBMaXN0ZW5lcigpOwotICAgICAgICBmcGouYWRkTGlzdGVuZXIoIGZ1bGxMaXN0ZW5lclByb2plY3RBcGkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0ZW5lciBmdWxsTGlzdGVuZXJHbG9iYWxBcGkgPSBuZXcgTGlzdGVuZXIoKTsKLSAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSApOwotCi0gICAgICAgIGZpbmFsIExpc3RlbmVyIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGkgPSBuZXcgTGlzdGVuZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGZwai5hZGRMaXN0ZW5lciggcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUkVfSU5TVEFMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5GSVhFRF9GQUNFVFNfQ0hBTkdFRCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdGVuZXIgcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpID0gbmV3IExpc3RlbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lciggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX0lOU1RBTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5GSVhFRF9GQUNFVFNfQ0hBTkdFRCApOwotICAgICAgICAKLSAgICAgICAgaWYoIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZS5yZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLnJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFkZFRlYXJEb3duT3BlcmF0aW9uCi0gICAgICAgICgKLSAgICAgICAgICAgIG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGkgKTsKLSAgICAgICAgICAgICAgICAgICAgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsucmVtb3ZlTGlzdGVuZXIoIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJ1biB0aHJvdWdoIGEgc2VyaWVzIG9mIG9wZXJhdGlvbnMsIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsaXN0ZW5lcnMgYXJlIHNlZWluZwotICAgICAgICAvLyB0aGUgZXhwZWN0ZWQgZXZlbnRzLgotICAgICAgICAKLSAgICAgICAgZnBqLnNldEZpeGVkUHJvamVjdEZhY2V0cyggYXNTZXQoIGYxLCBmMiApICk7Ci0gICAgICAgIAotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwMSApOwotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXAxICk7Ci0gICAgICAgIGNoZWNrKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLmZ1bGxTdGVwMSApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMSApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXAxICk7Ci0gICAgICAgIGNoZWNrKCBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMSApOwotICAgICAgICAKLSAgICAgICAgZnBqLm1vZGlmeSggYXNTZXQoIG5ldyBBY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIGYxdjEwLCBudWxsICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMnYxMSwgbnVsbCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjN2MTIsIG51bGwgKSApLCBudWxsICk7Ci0KLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5mdWxsU3RlcDIgKTsKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwMiApOwotICAgICAgICBjaGVjayggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5mdWxsU3RlcDIgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDIgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMiApOwotICAgICAgICBjaGVjayggUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5wYXJ0aWFsU3RlcDIgKTsKLSAgICAgICAgCi0gICAgICAgIGZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmNHYxMywgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5mdWxsU3RlcDMgKTsKLSAgICAgICAgY2hlY2soIGZ1bGxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwMyApOwotICAgICAgICBjaGVjayggRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5mdWxsU3RlcDMgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lclByb2plY3RBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDMgKTsKLSAgICAgICAgY2hlY2soIHBhcnRpYWxMaXN0ZW5lckdsb2JhbEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwMyApOwotICAgICAgICBjaGVjayggUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIuaW5zdGFuY2UsIFJlc291cmNlcy5wYXJ0aWFsU3RlcDMgKTsKLSAgICAgICAgCi0gICAgICAgIGZwai51bmluc3RhbGxQcm9qZWN0RmFjZXQoIGYzdjEyLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwNCApOwotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXA0ICk7Ci0gICAgICAgIGNoZWNrKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLmZ1bGxTdGVwNCApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNCApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA0ICk7Ci0gICAgICAgIGNoZWNrKCBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNCApOwotICAgICAgICAKLSAgICAgICAgZnBqLnNldEZpeGVkUHJvamVjdEZhY2V0cyggYXNTZXQoIGY0ICkgKTsKLSAgICAgICAgCi0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXA1ICk7Ci0gICAgICAgIGNoZWNrKCBmdWxsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5mdWxsU3RlcDUgKTsKLSAgICAgICAgY2hlY2soIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMuZnVsbFN0ZXA1ICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJQcm9qZWN0QXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA1ICk7Ci0gICAgICAgIGNoZWNrKCBwYXJ0aWFsTGlzdGVuZXJHbG9iYWxBcGksIFJlc291cmNlcy5wYXJ0aWFsU3RlcDUgKTsKLSAgICAgICAgY2hlY2soIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyLmluc3RhbmNlLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA1ICk7Ci0gICAgICAgIAotICAgICAgICBmcGoubW9kaWZ5KCBhc1NldCggbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0UsIGYxdjIwLCBudWxsICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRSwgZjR2MjMsIG51bGwgKSApLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLmZ1bGxTdGVwNiApOwotICAgICAgICBjaGVjayggZnVsbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMuZnVsbFN0ZXA2ICk7Ci0gICAgICAgIGNoZWNrKCBGdWxsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLmZ1bGxTdGVwNiApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyUHJvamVjdEFwaSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNiApOwotICAgICAgICBjaGVjayggcGFydGlhbExpc3RlbmVyR2xvYmFsQXBpLCBSZXNvdXJjZXMucGFydGlhbFN0ZXA2ICk7Ci0gICAgICAgIGNoZWNrKCBQYXJ0aWFsRXh0ZW5zaW9uQmFzZWRMaXN0ZW5lci5pbnN0YW5jZSwgUmVzb3VyY2VzLnBhcnRpYWxTdGVwNiApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoIGZpbmFsIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+IGV2ZW50cyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50IDogZXZlbnRzICkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCggZXZlbnQudG9TdHJpbmcoKSApLmFwcGVuZCggJ1xuJyApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2soIGZpbmFsIExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZEV2ZW50cyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsID0gdG9TdHJpbmcoIGxpc3RlbmVyLnJldHJpZXZlRGVsaXZlcmVkRXZlbnRzKCkgKS50cmltKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkRXZlbnRzLnRyaW0oKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZXhwZWN0ZWQsIGFjdHVhbCApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0ZW5lciAKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4gZXZlbnRzID0gbmV3IEFycmF5TGlzdDxJRmFjZXRlZFByb2plY3RFdmVudD4oKTsKLQotICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV2ZW50cy5hZGQoIGV2ZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiByZXRyaWV2ZURlbGl2ZXJlZEV2ZW50cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+IHJlc3VsdCAKLSAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8SUZhY2V0ZWRQcm9qZWN0RXZlbnQ+KCB0aGlzLmV2ZW50cyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLmV2ZW50cy5jbGVhcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRnVsbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBMaXN0ZW5lcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdGVuZXIgaW5zdGFuY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEZ1bGxFeHRlbnNpb25CYXNlZExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaW5zdGFuY2UgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UucmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiByZXRyaWV2ZUV2ZW50cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UucmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFydGlhbEV4dGVuc2lvbkJhc2VkTGlzdGVuZXIKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBMaXN0ZW5lcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdGVuZXIgaW5zdGFuY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFBhcnRpYWxFeHRlbnNpb25CYXNlZExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggaW5zdGFuY2UgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UucmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0PElGYWNldGVkUHJvamVjdEV2ZW50PiByZXRyaWV2ZUV2ZW50cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UucmV0cmlldmVEZWxpdmVyZWRFdmVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcwotICAgIAotICAgICAgICBleHRlbmRzIE5MUwotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1bGxTdGVwMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnVsbFN0ZXAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmdWxsU3RlcDM7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZ1bGxTdGVwNDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnVsbFN0ZXA1OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmdWxsU3RlcDY7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnRpYWxTdGVwMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydGlhbFN0ZXAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJ0aWFsU3RlcDM7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnRpYWxTdGVwNDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydGlhbFN0ZXA1OwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJ0aWFsU3RlcDY7Ci0gICAgICAgIAotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBFdmVudERlbGl2ZXJ5VGVzdHMuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRXZlbnREZWxpdmVyeVRlc3RzLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRXZlbnREZWxpdmVyeVRlc3RzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZmQ5NjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0V2ZW50RGVsaXZlcnlUZXN0cy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLWZ1bGxTdGVwMSA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJGSVhFRF9GQUNFVFNfQ0hBTkdFRCI+XG5cCi1cICA8b2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgIDwvb2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgIDxuZXctZml4ZWQtZmFjZXRzPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjEiLz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YyIi8+XG5cCi1cICA8L25ldy1maXhlZC1mYWNldHM+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBST0pFQ1RfTU9ESUZJRUQiPlxuXAotPC9ldmVudD4KLQotZnVsbFN0ZXAyID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMSIgdmVyc2lvblw9IjEuMCIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQT1NUX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YxIiB2ZXJzaW9uXD0iMS4wIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMiIgdmVyc2lvblw9IjEuMSIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQT1NUX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YyIiB2ZXJzaW9uXD0iMS4xIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMyIgdmVyc2lvblw9IjEuMiIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQT1NUX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YzIiB2ZXJzaW9uXD0iMS4yIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBST0pFQ1RfTU9ESUZJRUQiPlxuXAotPC9ldmVudD4KLQotZnVsbFN0ZXAzID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mNCIgdmVyc2lvblw9IjEuMyIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQT1NUX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2Y0IiB2ZXJzaW9uXD0iMS4zIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBST0pFQ1RfTU9ESUZJRUQiPlxuXAotPC9ldmVudD4KLQotZnVsbFN0ZXA0ID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9VTklOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YzIiB2ZXJzaW9uXD0iMS4yIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBPU1RfVU5JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMyIgdmVyc2lvblw9IjEuMiIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUk9KRUNUX01PRElGSUVEIj5cblwKLTwvZXZlbnQ+Ci0KLWZ1bGxTdGVwNSA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJGSVhFRF9GQUNFVFNfQ0hBTkdFRCI+XG5cCi1cICA8b2xkLWZpeGVkLWZhY2V0cz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YxIi8+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMiIvPlxuXAotXCAgPC9vbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgPG5ldy1maXhlZC1mYWNldHM+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mNCIvPlxuXAotXCAgPC9uZXctZml4ZWQtZmFjZXRzPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUk9KRUNUX01PRElGSUVEIj5cblwKLTwvZXZlbnQ+Ci0KLWZ1bGxTdGVwNiA9IFwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfVkVSU0lPTl9DSEFOR0UiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YxIiB2ZXJzaW9uXD0iMi4wIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBPU1RfVkVSU0lPTl9DSEFOR0UiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YxIiB2ZXJzaW9uXD0iMi4wIi8+XG5cCi08L2V2ZW50PlxuXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9WRVJTSU9OX0NIQU5HRSI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjQiIHZlcnNpb25cPSIyLjMiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUE9TVF9WRVJTSU9OX0NIQU5HRSI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjQiIHZlcnNpb25cPSIyLjMiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJPSkVDVF9NT0RJRklFRCI+XG5cCi08L2V2ZW50PgotCi1wYXJ0aWFsU3RlcDEgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iRklYRURfRkFDRVRTX0NIQU5HRUQiPlxuXAotXCAgPG9sZC1maXhlZC1mYWNldHM+XG5cCi1cICA8L29sZC1maXhlZC1mYWNldHM+XG5cCi1cICA8bmV3LWZpeGVkLWZhY2V0cz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YxIi8+XG5cCi1cICAgIDxmYWNldCBpZFw9ImVkdF9mMiIvPlxuXAotXCAgPC9uZXctZml4ZWQtZmFjZXRzPlxuXAotPC9ldmVudD4KLQotcGFydGlhbFN0ZXAyID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IlBSRV9JTlNUQUxMIj5cblwKLVwgIDxmYWNldCBpZFw9ImVkdF9mMSIgdmVyc2lvblw9IjEuMCIvPlxuXAotPC9ldmVudD5cblwKLTxldmVudCBwcm9qZWN0XD0idGVzdFByb2plY3QiIHR5cGVcPSJQUkVfSU5TVEFMTCI+XG5cCi1cICA8ZmFjZXQgaWRcPSJlZHRfZjIiIHZlcnNpb25cPSIxLjEiLz5cblwKLTwvZXZlbnQ+XG5cCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2YzIiB2ZXJzaW9uXD0iMS4yIi8+XG5cCi08L2V2ZW50PgotCi1wYXJ0aWFsU3RlcDMgPSBcCi08ZXZlbnQgcHJvamVjdFw9InRlc3RQcm9qZWN0IiB0eXBlXD0iUFJFX0lOU1RBTEwiPlxuXAotXCAgPGZhY2V0IGlkXD0iZWR0X2Y0IiB2ZXJzaW9uXD0iMS4zIi8+XG5cCi08L2V2ZW50PgotCi1wYXJ0aWFsU3RlcDQgPSAKLQotcGFydGlhbFN0ZXA1ID0gXAotPGV2ZW50IHByb2plY3RcPSJ0ZXN0UHJvamVjdCIgdHlwZVw9IkZJWEVEX0ZBQ0VUU19DSEFOR0VEIj5cblwKLVwgIDxvbGQtZml4ZWQtZmFjZXRzPlxuXAotXCAgICA8ZmFjZXQgaWRcPSJlZHRfZjEiLz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2YyIi8+XG5cCi1cICA8L29sZC1maXhlZC1mYWNldHM+XG5cCi1cICA8bmV3LWZpeGVkLWZhY2V0cz5cblwKLVwgICAgPGZhY2V0IGlkXD0iZWR0X2Y0Ii8+XG5cCi1cICA8L25ldy1maXhlZC1mYWNldHM+XG5cCi08L2V2ZW50PgotCi1wYXJ0aWFsU3RlcDYgPSAKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldEFjdGlvblNvcnRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0QWN0aW9uU29ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhN2Q3YmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0QWN0aW9uU29ydFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuVGVzdFV0aWxzLmFzU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1AU3VwcHJlc3NXYXJuaW5ncyggInVudXNlZCIgKQotcHVibGljIGNsYXNzIEZhY2V0QWN0aW9uU29ydFRlc3RzCi0KLSAgICBleHRlbmRzIFRlc3RDYXNlCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxMjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MjA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYzNTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYzNWE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjJ2NDdiOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYydjQ3YzsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYyZXh0OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYyZXh0djEwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmM2E7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNhdjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYXYyMDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjNiOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYzYnYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2J2MjA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGYzYzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM2N2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjNjdjIwOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDEiICk7Ci0gICAgICAgICAgICBmMXYxMCA9IGYxLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmMXYxMiA9IGYxLmdldFZlcnNpb24oICIxLjIiICk7Ci0gICAgICAgICAgICBmMXYxMjEgPSBmMS5nZXRWZXJzaW9uKCAiMS4yLjEiICk7Ci0gICAgICAgICAgICBmMXYxMyA9IGYxLmdldFZlcnNpb24oICIxLjMiICk7Ci0gICAgICAgICAgICBmMXYyMCA9IGYxLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGYyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQyIiApOwotICAgICAgICAgICAgZjJ2MzUgPSBmMi5nZXRWZXJzaW9uKCAiMy41IiApOwotICAgICAgICAgICAgZjJ2MzVhID0gZjIuZ2V0VmVyc2lvbiggIjMuNSNhIiApOwotICAgICAgICAgICAgZjJ2NDcgPSBmMi5nZXRWZXJzaW9uKCAiNC43IiApOwotICAgICAgICAgICAgZjJ2NDdiID0gZjIuZ2V0VmVyc2lvbiggIjQuNyNiIiApOwotICAgICAgICAgICAgZjJ2NDdjID0gZjIuZ2V0VmVyc2lvbiggIjQuNyNjIiApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmMmV4dCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0MmV4dCIgKTsKLSAgICAgICAgICAgIGYyZXh0djEwID0gZjJleHQuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICAgICAgZjNhID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQzYSIgKTsKLSAgICAgICAgICAgIGYzYXYxMCA9IGYzYS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjNhdjIwID0gZjNhLmdldFZlcnNpb24oICIyLjAiICk7Ci0KLSAgICAgICAgICAgIGYzYiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZhY2V0M2IiICk7Ci0gICAgICAgICAgICBmM2J2MTAgPSBmM2IuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgICAgIGYzYnYyMCA9IGYzYi5nZXRWZXJzaW9uKCAiMi4wIiApOwotCi0gICAgICAgICAgICBmM2MgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYWNldDNjIiApOwotICAgICAgICAgICAgZjNjdjEwID0gZjNjLmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgICAgICBmM2N2MjAgPSBmM2MuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgZmFpbHVyZXMuIFRoaXMgYXBpIGlzIHRlc3RlZCBleHBsaWNpdGx5LgotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRmFjZXRBY3Rpb25Tb3J0VGVzdHMoIGZpbmFsIFN0cmluZyBuYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICBzdWl0ZS5zZXROYW1lKCAiRmFjZXQgQWN0aW9uIFNvcnQgVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0QWN0aW9uU29ydFRlc3RzKCAidGVzdFVuaW5zdGFsbENvbWVzRmlyc3QxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldEFjdGlvblNvcnRUZXN0cyggInRlc3RVbmluc3RhbGxDb21lc0ZpcnN0MiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRBY3Rpb25Tb3J0VGVzdHMoICJ0ZXN0U29ydFN0YWJpbGl0eTEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0QWN0aW9uU29ydFRlc3RzKCAidGVzdFNvcnRTdGFiaWxpdHkyIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHNvcnQgcGxhY2VzIHVuaW5zdGFsbCBhY3Rpb25zIGZpcnN0LiBUaGlzIGlzIHRoZSAKLSAgICAgKiBjb250cm9sIHRlc3QgY2FzZS4gVGhlIGlucHV0IGFscmVhZHkgcGxhY2VzIHVuaW5zdGFsbCBmaXJzdC4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnN0YWxsQ29tZXNGaXJzdDEoKQotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uIGExID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MTIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgQWN0aW9uIGEyID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVU5JTlNUQUxMLCBmM2F2MTAsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8QWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxBY3Rpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb25zLmFkZCggYTIgKTsKLSAgICAgICAgYWN0aW9ucy5hZGQoIGExICk7Ci0gICAgICAgIAotICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5zb3J0KCBhc1NldCggZjNhdjEwICksIGFjdGlvbnMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhY3Rpb25zLCBhc0xpc3QoIGEyLCBhMSApICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHNvcnQgcGxhY2VzIHVuaW5zdGFsbCBhY3Rpb25zIGZpcnN0LiBUaGUgdGVzdCBjYXNlIAotICAgICAqIHBsYWNlcyBhbiBpbnN0YWxsIGFjdGlvbiBpbiBmcm9udCBvZiB0aGUgdW5pbnN0YWxsIGFjdGlvbiBhbmQgY2hlY2tzCi0gICAgICogd2hldGhlciB0aGUgc29ydCBhbGdvcml0aG0gcmV2ZXJzZXMgdGhlIG9yZGVyLiAKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnN0YWxsQ29tZXNGaXJzdDIoKQotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uIGExID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MTIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgQWN0aW9uIGEyID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuVU5JTlNUQUxMLCBmM2F2MTAsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8QWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxBY3Rpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb25zLmFkZCggYTEgKTsKLSAgICAgICAgYWN0aW9ucy5hZGQoIGEyICk7Ci0gICAgICAgIAotICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5zb3J0KCBhc1NldCggZjNhdjEwICksIGFjdGlvbnMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhY3Rpb25zLCBhc0xpc3QoIGEyLCBhMSApICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgc29ydCBwcm9kdWNlcyAic3RhYmxlIiByZXN1bHRzIGdpdmVuIHVucmVsYXRlZCBmYWNldHMuCi0gICAgICogVGhpcyBpcyB0aGUgY29udHJvbCB0ZXN0IGNhc2UuIFRoZSBpbnB1dCBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IG9yZGVyLiAKLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb3J0U3RhYmlsaXR5MSgpCi0gICAgewotICAgICAgICBmaW5hbCBBY3Rpb24gYTEgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmMXYxMiwgbnVsbCApOwotICAgICAgICBmaW5hbCBBY3Rpb24gYTIgPSBuZXcgQWN0aW9uKCBBY3Rpb24uVHlwZS5JTlNUQUxMLCBmM2F2MTAsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIExpc3Q8QWN0aW9uPiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdDxBY3Rpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBhY3Rpb25zLmFkZCggYTEgKTsKLSAgICAgICAgYWN0aW9ucy5hZGQoIGEyICk7Ci0gICAgICAgIAotICAgICAgICBQcm9qZWN0RmFjZXRzTWFuYWdlci5zb3J0KCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIGFjdGlvbnMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhY3Rpb25zLCBhc0xpc3QoIGExLCBhMiApICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgc29ydCBwcm9kdWNlcyAic3RhYmxlIiByZXN1bHRzIGdpdmVuIHVucmVsYXRlZCBmYWNldHMuCi0gICAgICogVGhlIGlucHV0IGZhY2V0cyBhcmUgaW4gdGhlIHJldmVyc2Ugb3JkZXIuCi0gICAgICovCi0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydFN0YWJpbGl0eTIoKQotICAgIHsKLSAgICAgICAgZmluYWwgQWN0aW9uIGExID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjF2MTIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgQWN0aW9uIGEyID0gbmV3IEFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgZjNhdjEwLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgYWN0aW9ucy5hZGQoIGEyICk7Ci0gICAgICAgIGFjdGlvbnMuYWRkKCBhMSApOwotICAgICAgICAKLSAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuc29ydCggQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBhY3Rpb25zICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggYWN0aW9ucywgYXNMaXN0KCBhMSwgYTIgKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldEFjdGlvbnNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0QWN0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTA2ZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0QWN0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRmFjZXRBY3Rpb25zVGVzdHMKLQotICAgIGV4dGVuZHMgQWJzdHJhY3RUZXN0cwotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYyOwotICAgIAotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmYXRfZjEiICk7Ci0gICAgICAgIGYxdjEgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBmMXYyID0gZjEuZ2V0VmVyc2lvbiggIjIuMCIgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBGYWNldEFjdGlvbnNUZXN0cyggZmluYWwgU3RyaW5nIG5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG5hbWUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHN1aXRlLnNldE5hbWUoICJGYWNldCBBY3Rpb25zIFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldEFjdGlvbnNUZXN0cyggInRlc3RNdWx0aVZlcnNpb25JbnN0YWxsMSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRBY3Rpb25zVGVzdHMoICJ0ZXN0TXVsdGlWZXJzaW9uSW5zdGFsbDIiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHRlc3QgY2FzZXMgdGVzdCB0aGUgc2NlbmFyaW8gd2hlcmUgZGlmZmVyZW50IAotICAgICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgSU5TVEFMTCBhY3Rpb24gYXJlIHByb3ZpZGVkIGZvciB0d28gdmVyc2lvbnMgb2YgCi0gICAgICogdGhlIHNhbWUgZmFjZXQuCi0gICAgICogCi0gICAgICogU2NlbmFyaW8gVGVzdCBDb2RlOgotICAgICAqIAotICAgICAqICAgdGVzdE11bHRpVmVyc2lvbkluc3RhbGwxCi0gICAgICogICB0ZXN0TXVsdGlWZXJzaW9uSW5zdGFsbDIKLSAgICAgKiAgIEYxdjFJbnN0YWxsRGVsZWdhdGUKLSAgICAgKiAgIEYxdjJJbnN0YWxsRGVsZWdhdGUKLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlWZXJzaW9uSW5zdGFsbDEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcGogPSBjcmVhdGVGYWNldGVkUHJvamVjdCgpOwotICAgICAgICBmaW5hbCBJUHJvamVjdCBwaiA9IGZwai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGZwai5pbnN0YWxsUHJvamVjdEZhY2V0KCBmMXYxLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCBGMXYxSW5zdGFsbERlbGVnYXRlLmdldE1hcmtlckZpbGUoIHBqICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIEYxdjJJbnN0YWxsRGVsZWdhdGUuZ2V0TWFya2VyRmlsZSggcGogKS5leGlzdHMoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVZlcnNpb25JbnN0YWxsMigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiA9IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHBqID0gZnBqLmdldFByb2plY3QoKTsKLSAgICAgICAgZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKCBGMXYxSW5zdGFsbERlbGVnYXRlLmdldE1hcmtlckZpbGUoIHBqICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggRjF2Mkluc3RhbGxEZWxlZ2F0ZS5nZXRNYXJrZXJGaWxlKCBwaiApLmV4aXN0cygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRjF2MUluc3RhbGxEZWxlZ2F0ZQotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0TWFya2VyRmlsZSggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0LmdldEZpbGUoICJ2MW1hcmtlciIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUZpbGUgbWFya2VyID0gZ2V0TWFya2VyRmlsZSggcHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBlbXB0eVN0cmVhbSAKLSAgICAgICAgICAgICAgICA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggbmV3IGJ5dGVbIDAgXSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtYXJrZXIuY3JlYXRlKCBlbXB0eVN0cmVhbSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRjF2Mkluc3RhbGxEZWxlZ2F0ZQotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0TWFya2VyRmlsZSggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0LmdldEZpbGUoICJ2Mm1hcmtlciIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgICAgICAKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUZpbGUgbWFya2VyID0gZ2V0TWFya2VyRmlsZSggcHJvamVjdCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBlbXB0eVN0cmVhbSAKLSAgICAgICAgICAgICAgICA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggbmV3IGJ5dGVbIDAgXSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtYXJrZXIuY3JlYXRlKCBlbXB0eVN0cmVhbSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldENvbnN0cmFpbnRzVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9GYWNldENvbnN0cmFpbnRzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3OTBiNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRDb25zdHJhaW50c1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMuYXNTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGNsYXNzIEZhY2V0Q29uc3RyYWludHNUZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTA7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMzsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmM3YxMDsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjR2MTA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY1OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY1djEwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjZ2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjZ2MjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjZ2Mzc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjZ2NDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjZ2NDU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY3OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY3djEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY3djIwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmODsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmOHYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmOHYyMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmOHYzMDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0IGY5OwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGY5djEwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjEwOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxMHYxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMTB2MjA7Ci0gICAgCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBmMSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mMSIgKTsKLSAgICAgICAgZjF2MTAgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgIGYzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2YzIiApOwotICAgICAgICBmM3YxMCA9IGYzLmdldFZlcnNpb24oICIxLjAiICk7Ci0KLSAgICAgICAgZjQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjQiICk7Ci0gICAgICAgIGY0djEwID0gZjQuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICBmNSA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mNSIgKTsKLSAgICAgICAgZjV2MTAgPSBmNS5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgIGY2ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmN0X2Y2IiApOwotICAgICAgICBmNnYxMCA9IGY2LmdldFZlcnNpb24oICIxLjAiICk7Ci0gICAgICAgIGY2djIzID0gZjYuZ2V0VmVyc2lvbiggIjIuMyIgKTsKLSAgICAgICAgZjZ2MzcgPSBmNi5nZXRWZXJzaW9uKCAiMy43IiApOwotICAgICAgICBmNnY0MCA9IGY2LmdldFZlcnNpb24oICI0LjAiICk7Ci0gICAgICAgIGY2djQ1ID0gZjYuZ2V0VmVyc2lvbiggIjQuNSIgKTsKLQotICAgICAgICBmNyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImZjdF9mNyIgKTsKLSAgICAgICAgZjd2MTAgPSBmNy5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBmN3YyMCA9IGY3LmdldFZlcnNpb24oICIyLjAiICk7Ci0KLSAgICAgICAgZjggPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjgiICk7Ci0gICAgICAgIGY4djEwID0gZjguZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgZjh2MjAgPSBmOC5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICBmOHYzMCA9IGY4LmdldFZlcnNpb24oICIzLjAiICk7Ci0KLSAgICAgICAgZjkgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjkiICk7Ci0gICAgICAgIGY5djEwID0gZjkuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLQotICAgICAgICBmMTAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJmY3RfZjEwIiApOwotICAgICAgICBmMTB2MTAgPSBmMTAuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICAgICAgZjEwdjIwID0gZjEwLmdldFZlcnNpb24oICIyLjAiICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIkZhY2V0IENvbnN0cmFpbnQgVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0MSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3QyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0NCIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3Q1IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0SW5kaXJlY3RDb25mbGljdDYiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RJbmRpcmVjdENvbmZsaWN0NyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgRmFjZXRDb25zdHJhaW50c1Rlc3RzKCAidGVzdEluZGlyZWN0Q29uZmxpY3Q4IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0UmVxdWlyZXNXaXRoTm9WZXJzaW9uIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0UmVxdWlyZXNXaXRoVW5rbm93blZlcnNpb24iICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEZhY2V0Q29uc3RyYWludHNUZXN0cyggInRlc3RHcm91cFJlcXVpcmVzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBGYWNldENvbnN0cmFpbnRzVGVzdHMoICJ0ZXN0R3JvdXBSZXF1aXJlc1NvZnQiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBjb25mbGljdCBkZXRlY3Rpb24gY29kZSBwaWNrcyB1cCBvbiBhbiBpbmRpcmVjdAotICAgICAqIGNvbmZsaWN0LiBBbHNvIHRlc3RzIHRoYXQgYSBzb2Z0IGNvbnN0cmFpbnQgaXMgbm90IHVzZWQgdG8gZmxhZyBhCi0gICAgICogY29uZmxpY3QuCi0gICAgICogCi0gICAgICogSGVyZSBpcyB0aGUgcmVsYXRpb25zaGlwIGRpYWdyYW0gYmV0d2VlbiB0aGUgZml2ZSBmYWNldHMgaW52b2x2ZWQgaW4gCi0gICAgICogdGhpcyB0ZXN0OiAKLSAgICAgKiAKLSAgICAgKiAgICAgICAgICAgY29uZmxpY3RzICAgICAgICAgICAgcmVxdWlyZXMKLSAgICAgKiAgIGYxIC0tLS0tLS0tLS0tLS0tLS0+IGYyIDwtLS0tLS0tLS0tLS0tLS0tIGYzCi0gICAgICogICBmNCA8LS0tLS0tLS0tLS0tLS0tLSAgICA8LS0tLS0tLS0tLS0tLS0tLSBmNQotICAgICAqICAgICAgICAgICBjb25mbGljdHMgICAgICAgICBzb2Z0IHJlcXVpcmVzCi0gICAgICogCi0gICAgICogVGhlc2UgY2FzZSBzaG91bGQgY29tZSBiYWNrIHBvc2l0aXZlIGZvciBjb25mbGljdDoKLSAgICAgKiAKLSAgICAgKiAgIGYxIHdpdGggZjMKLSAgICAgKiAgIGYzIHdpdGggZjEKLSAgICAgKiAgIGY0IHdpdGggZjMKLSAgICAgKiAgIGYzIHdpdGggZjQKLSAgICAgKiAgIAotICAgICAqIFRoZXNlIGNhc2Ugc2hvdWxkIGNvbWUgYmFjayBuZWdhdGl2ZSBmb3IgY29uZmxpY3Q6Ci0gICAgICogCi0gICAgICogICBmMSB3aXRoIGY1Ci0gICAgICogICBmNSB3aXRoIGYxCi0gICAgICogICBmNCB3aXRoIGY1Ci0gICAgICogICBmNSB3aXRoIGY0Ci0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3QxKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxdjEwLmNvbmZsaWN0c1dpdGgoIGYzdjEwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0Q29uZmxpY3QyKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIGYzdjEwLmNvbmZsaWN0c1dpdGgoIGYxdjEwICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjR2MTAuY29uZmxpY3RzV2l0aCggZjN2MTAgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0NCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBmM3YxMC5jb25mbGljdHNXaXRoKCBmNHYxMCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdENvbmZsaWN0NSgpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggZjF2MTAuY29uZmxpY3RzV2l0aCggZjV2MTAgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDYoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY1djEwLmNvbmZsaWN0c1dpdGgoIGYxdjEwICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDcoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY0djEwLmNvbmZsaWN0c1dpdGgoIGY1djEwICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RDb25mbGljdDgoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY1djEwLmNvbmZsaWN0c1dpdGgoIGY0djEwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBUZXN0cyB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQ6Ci0gICAgICogCi0gICAgICogICA8cmVxdWlyZXMgZmFjZXQ9ImZjdF9mNiIvPgotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVzV2l0aE5vVmVyc2lvbigpCi0gICAgewotICAgICAgICBhc3NlcnRGYWxzZSggZjd2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjd2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmN3YxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnYyMyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGY3djEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY2djM3ICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjd2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjZ2NDAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmN3YxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnY0NSApICkuaXNPSygpICk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdHMgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50IHRoYXQgc3BlY2lmaWVzIHZlcnNpb25zIHRoYXQgZG9uJ3QgZXhpc3Q6Ci0gICAgICogCi0gICAgICogICA8cmVxdWlyZXMgZmFjZXQ9ImZjdF9mNiIgdmVyc2lvbj0iWzUuMC02LjUpIi8+Ci0gICAgICovCi0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZXNXaXRoVW5rbm93blZlcnNpb24oKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGY3djIwLmdldENvbnN0cmFpbnQoKS5jaGVjayggQ29sbGVjdGlvbnMuRU1QVFlfU0VUICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmN3YyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmN3YyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnYyMyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmN3YyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnYzNyApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmN3YyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnY0MCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmN3YyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmNnY0NSApICkuaXNPSygpICk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdHMgdGhlICJyZXF1aXJlcyBhbnkgZ3JvdXAgbWVtYmVyIiBjb25zdHJhaW50OgotICAgICAqIAotICAgICAqICAgPHJlcXVpcmVzIGdyb3VwPSJmY3RfZzEiLz4KLSAgICAgKi8KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cFJlcXVpcmVzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMTB2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY4djEwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZjEwdjEwLmdldENvbnN0cmFpbnQoKS5jaGVjayggYXNTZXQoIGY4djIwICkgKS5pc09LKCkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGYxMHYxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOHYzMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYxMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIGFzU2V0KCBmOXYxMCApICkuaXNPSygpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBmMTB2MTAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTAgKSApLmlzT0soKSApOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGVzdHMgdGhlIHNvZnQgdmVyc2lvbiBvZiB0aGUgInJlcXVpcmVzIGFueSBncm91cCBtZW1iZXIiIGNvbnN0cmFpbnQ6Ci0gICAgICogCi0gICAgICogICA8cmVxdWlyZXMgZ3JvdXA9ImZjdF9nMSIgc29mdD0idHJ1ZSIvPgotICAgICAqLwotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwUmVxdWlyZXNTb2Z0KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIGYxMHYyMC5nZXRDb25zdHJhaW50KCkuY2hlY2soIENvbGxlY3Rpb25zLkVNUFRZX1NFVCApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjh2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjh2MjAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjh2MzAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjl2MTAgKSApLmlzT0soKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmMTB2MjAuZ2V0Q29uc3RyYWludCgpLmNoZWNrKCBhc1NldCggZjF2MTAgKSApLmlzT0soKSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL0ZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrQ29yZVRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtDb3JlVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyNjJmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvRmFjZXRlZFByb2plY3RGcmFtZXdvcmtDb3JlVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldGVkUHJvamVjdEZyYW1ld29ya0NvcmVUZXN0c1BsdWdpbgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cyI7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9QcmVzZXRzVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9QcmVzZXRzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3MDJlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJlc2V0c1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQmFzaWNUZXN0cy5mMXYxMjE7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkJhc2ljVGVzdHMuZjF2MjA7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkJhc2ljVGVzdHMuZjJleHR2MTA7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkJhc2ljVGVzdHMuZjJ2MzVhOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5CYXNpY1Rlc3RzLmYzYXYxMDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQmFzaWNUZXN0cy5mM2J2MTA7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLkJhc2ljVGVzdHMuZjNjdjEwOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5hc1NldDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRHluYW1pY1ByZXNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJlc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcmVzZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByZXNldERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFByZXNldHNUZXN0cwotCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotICAgIAotewotICAgIHByaXZhdGUgUHJlc2V0c1Rlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIlByZXNldHMgVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByZXNldHNUZXN0cyggInRlc3RTaW1wbGVTdGF0aWNQcmVzZXRzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcmVzZXRzVGVzdHMoICJ0ZXN0RGVyaXZlZFN0YXRpY1ByZXNldHMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByZXNldHNUZXN0cyggInRlc3REeW5hbWljUHJlc2V0cyIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJlc2V0c1Rlc3RzKCAidGVzdFN0YXRpY1ByZXNldHNFeHRlbmRpbmdEeW5hbWljUHJlc2V0czEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByZXNldHNUZXN0cyggInRlc3RTdGF0aWNQcmVzZXRzRXh0ZW5kaW5nRHluYW1pY1ByZXNldHMyIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcmVzZXRzVGVzdHMoICJ0ZXN0VXNlckRlZmluZWRQcmVzZXRzIiApICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdGF0aWNQcmVzZXRzKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X3ByZXNldDEiICkgKTsKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0KCAicHRfcHJlc2V0MSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0cygpLmNvbnRhaW5zKCBwcmVzZXQxICkgKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQxLmdldElkKCksICJwdF9wcmVzZXQxIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDEuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuU1RBVElDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0MS5nZXRMYWJlbCgpLCAiUHJlc2V0IDEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0MS5nZXREZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBmaXJzdCBwcmVzZXQuIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDEuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjF2MjAsIGYydjM1YSwgZjJleHR2MTAgKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfcHJlc2V0MiIgKSApOwotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldDIgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQoICJwdF9wcmVzZXQyIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkuY29udGFpbnMoIHByZXNldDIgKSApOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDIuZ2V0SWQoKSwgInB0X3ByZXNldDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0Mi5nZXRUeXBlKCksIElQcmVzZXQuVHlwZS5TVEFUSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQyLmdldExhYmVsKCksICJwdF9wcmVzZXQyIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDIuZ2V0RGVzY3JpcHRpb24oKSwgIiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQyLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYzYXYxMCwgZjNidjEwLCBmM2N2MTAgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXJpdmVkU3RhdGljUHJlc2V0cygpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1ByZXNldERlZmluZWQoICJwdF9wcmVzZXQzIiApICk7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcHJlc2V0MyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldCggInB0X3ByZXNldDMiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKS5jb250YWlucyggcHJlc2V0MyApICk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0My5nZXRJZCgpLCAicHRfcHJlc2V0MyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQzLmdldFR5cGUoKSwgSVByZXNldC5UeXBlLlNUQVRJQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldDMuZ2V0UHJvamVjdEZhY2V0cygpLCBhc1NldCggZjF2MTIxLCBmMnYzNWEsIGYyZXh0djEwLCBmM2F2MTAgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1ByZXNldHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcmVzZXREZWZpbmVkKCAicHRfZHluX3ByZXNldCIgKSApOwotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldCggInB0X2R5bl9wcmVzZXQiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldHMoKS5jb250YWlucyggcHJlc2V0ICkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRJZCgpLCAicHRfZHluX3ByZXNldCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuRFlOQU1JQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRMYWJlbCgpLCAicHRfZHluX3ByZXNldCIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0RGVzY3JpcHRpb24oKSwgIiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0UHJvamVjdEZhY2V0cygpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRHluYW1pY1ByZXNldCBkeW5hbWljUHJlc2V0ID0gKElEeW5hbWljUHJlc2V0KSBwcmVzZXQ7Ci0gICAgICAgIGZpbmFsIElQcmVzZXQgcmVzb2x2ZWQgPSBkeW5hbWljUHJlc2V0LnJlc29sdmUoIENvbGxlY3Rpb25zLjxTdHJpbmcsT2JqZWN0PmVtcHR5TWFwKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0SWQoKSwgInB0X2R5bl9wcmVzZXQiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuU1RBVElDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0TGFiZWwoKSwgIkR5bmFtaWMgUHJlc2V0IiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldERlc2NyaXB0aW9uKCksICJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGR5bmFtaWMgcHJlc2V0LiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMXYyMCwgZjJleHR2MTAsIGYzY3YxMCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNQcmVzZXRzRXh0ZW5kaW5nRHluYW1pY1ByZXNldHMxKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMSIgKSApOwotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldCggInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0cygpLmNvbnRhaW5zKCBwcmVzZXQgKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldElkKCksICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFR5cGUoKSwgSVByZXNldC5UeXBlLkRZTkFNSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0TGFiZWwoKSwgIlN0YXRpYyBFeHRlbmRpbmcgRHluYW1pYyBQcmVzZXQiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldERlc2NyaXB0aW9uKCksICJUaGlzIGlzIHRoZSBzdGF0aWMtZHluYW1pYyBkZXNjcmlwdGlvbi4iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFByb2plY3RGYWNldHMoKSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUR5bmFtaWNQcmVzZXQgZHluYW1pY1ByZXNldCA9IChJRHluYW1pY1ByZXNldCkgcHJlc2V0OwotICAgICAgICBmaW5hbCBJUHJlc2V0IHJlc29sdmVkID0gZHluYW1pY1ByZXNldC5yZXNvbHZlKCBDb2xsZWN0aW9ucy48U3RyaW5nLE9iamVjdD5lbXB0eU1hcCgpICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldElkKCksICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzEiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuU1RBVElDICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0TGFiZWwoKSwgIlN0YXRpYyBFeHRlbmRpbmcgRHluYW1pYyBQcmVzZXQiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0RGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIHN0YXRpYy1keW5hbWljIGRlc2NyaXB0aW9uLiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMXYyMCwgZjJleHR2MTAsIGYzY3YxMCwgZjJ2MzVhLCBmM2J2MTAgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNQcmVzZXRzRXh0ZW5kaW5nRHluYW1pY1ByZXNldHMyKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMiIgKSApOwotICAgICAgICBmaW5hbCBJUHJlc2V0IHByZXNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByZXNldCggInB0X3N0YXRpY19leHRlbmRpbmdfZHluYW1pY19wcmVzZXRfMiIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJlc2V0cygpLmNvbnRhaW5zKCBwcmVzZXQgKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldElkKCksICJwdF9zdGF0aWNfZXh0ZW5kaW5nX2R5bmFtaWNfcHJlc2V0XzIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFR5cGUoKSwgSVByZXNldC5UeXBlLkRZTkFNSUMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0TGFiZWwoKSwgIlN0YXRpYyBFeHRlbmRpbmcgRHluYW1pYyBQcmVzZXQgMiIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0RGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIHN0YXRpYy1keW5hbWljIGRlc2NyaXB0aW9uIDIuIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHByZXNldC5nZXRQcm9qZWN0RmFjZXRzKCksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElEeW5hbWljUHJlc2V0IGR5bmFtaWNQcmVzZXQgPSAoSUR5bmFtaWNQcmVzZXQpIHByZXNldDsKLSAgICAgICAgZmluYWwgSVByZXNldCByZXNvbHZlZCA9IGR5bmFtaWNQcmVzZXQucmVzb2x2ZSggQ29sbGVjdGlvbnMuPFN0cmluZyxPYmplY3Q+ZW1wdHlNYXAoKSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCByZXNvbHZlZC5nZXRJZCgpLCAicHRfc3RhdGljX2V4dGVuZGluZ19keW5hbWljX3ByZXNldF8yIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldFR5cGUoKSwgSVByZXNldC5UeXBlLlNUQVRJQyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldExhYmVsKCksICJTdGF0aWMgRXh0ZW5kaW5nIER5bmFtaWMgUHJlc2V0IDIiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcmVzb2x2ZWQuZ2V0RGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIHN0YXRpYy1keW5hbWljIGRlc2NyaXB0aW9uIDIuIiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIHJlc29sdmVkLmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYxdjEyMSwgZjJleHR2MTAsIGYzY3YxMCwgZjJ2MzVhLCBmM2J2MTAsIGYzYXYxMCApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFByZXNldHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X3VzZXJfZGVmaW5lZCIgKSApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByZXNldCBwcmVzZXQKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZGVmaW5lUHJlc2V0KCAicHRfdXNlcl9kZWZpbmVkIiwgInRoZSBkZXNjcmlwdGlvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU2V0KCBmMXYxMjEsIGYyZXh0djEwICkgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggcHJlc2V0LmdldElkKCkgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXRzKCkuY29udGFpbnMoIHByZXNldCApICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBwcmVzZXQuZ2V0VHlwZSgpLCBJUHJlc2V0LlR5cGUuVVNFUl9ERUZJTkVEICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldExhYmVsKCksICJwdF91c2VyX2RlZmluZWQiICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldERlc2NyaXB0aW9uKCksICJ0aGUgZGVzY3JpcHRpb24iICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggcHJlc2V0LmdldFByb2plY3RGYWNldHMoKSwgYXNTZXQoIGYxdjEyMSwgZjJleHR2MTAgKSApOwotICAgICAgICAKLSAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuZGVsZXRlUHJlc2V0KCBwcmVzZXQgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJlc2V0RGVmaW5lZCggInB0X3VzZXJfZGVmaW5lZCIgKSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByZXNldEZhY3RvcnkgCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSVByZXNldEZhY3RvcnkKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgUHJlc2V0RGVmaW5pdGlvbiBjcmVhdGVQcmVzZXQoIGZpbmFsIFN0cmluZyBwcmVzZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLE9iamVjdD4gY29udGV4dCApIAotICAgICAgICAKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVzZXREZWZpbml0aW9uKCAiRHluYW1pYyBQcmVzZXQiLCAiVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkeW5hbWljIHByZXNldC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1NldCggZjF2MjAsIGYyZXh0djEwLCBmM2N2MTAgKSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1Byb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjY2U4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy5hc1NldDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMucmVhZEZyb21GaWxlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy53YWl0Rm9yQ29uZGl0aW9uOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlscy53cml0ZVRvRmlsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5UZXN0VXRpbHMuSUNvbmRpdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1AU3VwcHJlc3NXYXJuaW5ncyggInVudXNlZCIgKQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzCi0KLSAgICBleHRlbmRzIEFic3RyYWN0VGVzdHMKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfRklMRSAKLSAgICAgICAgPSAiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVF9OQU1FID0gInRlc3RQcm9qZWN0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXQgZjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZjF2MTIxOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjEzOwotICAgIHByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGYxdjIwOwotICAgIAotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGYxID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAiZmFjZXQxIiApOwotICAgICAgICAgICAgZjF2MTAgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICAgICAgZjF2MTIgPSBmMS5nZXRWZXJzaW9uKCAiMS4yIiApOwotICAgICAgICAgICAgZjF2MTIxID0gZjEuZ2V0VmVyc2lvbiggIjEuMi4xIiApOwotICAgICAgICAgICAgZjF2MTMgPSBmMS5nZXRWZXJzaW9uKCAiMS4zIiApOwotICAgICAgICAgICAgZjF2MjAgPSBmMS5nZXRWZXJzaW9uKCAiMi4wIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBmYWlsdXJlcy4gVGhpcyBhcGkgaXMgdGVzdGVkIGV4cGxpY2l0bHkuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwajsKLSAgICBwcml2YXRlIElGYWNldGVkUHJvamVjdCBmcGo7Ci0gICAgcHJpdmF0ZSBJRmlsZSBtZGZpbGU7Ci0KLSAgICBwcml2YXRlIFByb2plY3RDaGFuZ2VSZWFjdGlvblRlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIlByb2plY3QgQ2hhbmdlIFJlYWN0aW9uIFRlc3RzIiApOwotCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q2hhbmdlUmVhY3Rpb25UZXN0cyggInRlc3RSZWFjdGlvblRvUHJvamVjdERlbGV0ZSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMoICJ0ZXN0UmVhY3Rpb25Ub01ldGFkYXRhRmlsZURlbGV0ZSIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENoYW5nZVJlYWN0aW9uVGVzdHMoICJ0ZXN0UmVhY3Rpb25Ub01ldGFkYXRhRmlsZUNoYW5nZSIgKSApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCBURVNUX1BST0pFQ1RfTkFNRSApLmV4aXN0cygpICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZwaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggVEVTVF9QUk9KRUNUX05BTUUsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucGogPSB0aGlzLmZwai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGFkZFJlc291cmNlVG9DbGVhbnVwKCB0aGlzLnBqICk7Ci0gICAgICAgIGFzc2VydFRydWUoIHRoaXMuZnBqLmdldFByb2plY3QoKS5leGlzdHMoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5mcGouaW5zdGFsbFByb2plY3RGYWNldCggZjF2MTIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCB0aGlzLmZwai5nZXRQcm9qZWN0RmFjZXRzKCksIGFzU2V0KCBmMXYxMiApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm1kZmlsZSA9IHRoaXMucGouZ2V0RmlsZSggTUVUQURBVEFfRklMRSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhY3Rpb25Ub1Byb2plY3REZWxldGUoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHRoaXMucGouZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICB3YWl0Rm9yQ29uZGl0aW9uKCBjcmVhdGVOb0ZhY2V0c0NvbmRpdGlvbiggdGhpcy5mcGogKSApOwotICAgICAgICBhc3NlcnROdWxsKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHRoaXMucGogKSApOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZnBqLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEyLCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmeUNhbm5vdE1vZGlmeURlbGV0ZWRQcm9qZWN0RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwai5zZXRGaXhlZFByb2plY3RGYWNldHMoIGFzU2V0KCBmMSApICk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmeUNhbm5vdE1vZGlmeURlbGV0ZWRQcm9qZWN0RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZwai5zZXRUYXJnZXRlZFJ1bnRpbWVzKCBDb2xsZWN0aW9ucy48SVJ1bnRpbWU+ZW1wdHlTZXQoKSwgbnVsbCApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZnlDYW5ub3RNb2RpZnlEZWxldGVkUHJvamVjdEV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZnBqLnNldFByaW1hcnlSdW50aW1lKCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmeUNhbm5vdE1vZGlmeURlbGV0ZWRQcm9qZWN0RXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNhbm5vdE1vZGlmeURlbGV0ZWRQcm9qZWN0RXhjZXB0aW9uKCBmaW5hbCBDb3JlRXhjZXB0aW9uIGUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSA9ICJDYW5ub3QgbW9kaWZ5IGEgZGVsZXRlZCBwcm9qZWN0LiI7Ci0gICAgICAgIGFzc2VydFRydWUoIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLmVxdWFscyggZXhwZWN0ZWRNZXNzYWdlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhY3Rpb25Ub01ldGFkYXRhRmlsZURlbGV0ZSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgdGhpcy5tZGZpbGUuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0KLSAgICAgICAgd2FpdEZvckNvbmRpdGlvbiggY3JlYXRlTm9GYWNldHNDb25kaXRpb24oIHRoaXMuZnBqICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhY3Rpb25Ub01ldGFkYXRhRmlsZUNoYW5nZSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50czsKLSAgICAgICAgCi0gICAgICAgIGNvbnRlbnRzID0gcmVhZEZyb21GaWxlKCB0aGlzLm1kZmlsZSApOwotICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2VGaXJzdCggIjEuMiIsICIyLjAiICk7Ci0gICAgICAgIHdyaXRlVG9GaWxlKCB0aGlzLm1kZmlsZSwgY29udGVudHMgKTsKLSAgICAgICAgCi0gICAgICAgIHdhaXRGb3JDb25kaXRpb24oIGNyZWF0ZUZhY2V0Q29uZGl0aW9uKCB0aGlzLmZwaiwgZjF2MjAgKSApOwotICAgICAgICAKLSAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlRmlyc3QoICIyLjAiLCAiMS4yLjEiICk7Ci0gICAgICAgIHdyaXRlVG9GaWxlKCB0aGlzLm1kZmlsZSwgY29udGVudHMgKTsKLSAgICAgICAgCi0gICAgICAgIHdhaXRGb3JDb25kaXRpb24oIGNyZWF0ZUZhY2V0Q29uZGl0aW9uKCB0aGlzLmZwaiwgZjF2MTIxICkgKTsKLSAgICAgICAgCi0gICAgICAgIGNvbnRlbnRzID0gY29udGVudHMucmVwbGFjZUZpcnN0KCAiPGluc3RhbGxlZCBmYWNldD1cImZhY2V0MVwiIHZlcnNpb249XCIxLjIuMVwiLz4iLCAiIiApOwotICAgICAgICB3cml0ZVRvRmlsZSggdGhpcy5tZGZpbGUsIGNvbnRlbnRzICk7Ci0gICAgICAgIAotICAgICAgICB3YWl0Rm9yQ29uZGl0aW9uKCBjcmVhdGVOb0ZhY2V0c0NvbmRpdGlvbiggdGhpcy5mcGogKSApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJQ29uZGl0aW9uIGNyZWF0ZU5vRmFjZXRzQ29uZGl0aW9uKCBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgSUNvbmRpdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNoZWNrKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnBqLmdldFByb2plY3RGYWNldHMoKS5zaXplKCkgPT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUNvbmRpdGlvbiBjcmVhdGVGYWNldENvbmRpdGlvbiggZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IElDb25kaXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjaGVjaygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZwai5oYXNQcm9qZWN0RmFjZXQoIGZ2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL1Byb2plY3RDcmVhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJvamVjdENyZWF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwMmU2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvUHJvamVjdENyZWF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0LlRlc3RVdGlsczsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdENyZWF0aW9uVGVzdHMKLQotICAgIGV4dGVuZHMgQWJzdHJhY3RUZXN0cwotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVEVEX1BST0pFQ1RfTkFUVVJFCi0gICAgICAgID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLm5hdHVyZSI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMTsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMXYxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldCBmMjsKLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmMnYxOwotICAgIAotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgZjEgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoICJwY3QtZjEiICk7Ci0gICAgICAgIGYxdjEgPSBmMS5nZXRWZXJzaW9uKCAiMS4wIiApOwotCi0gICAgICAgIGYyID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAicGN0LWYyIiApOwotICAgICAgICBmMnYxID0gZjIuZ2V0VmVyc2lvbiggIjEuMCIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb2plY3RDcmVhdGlvblRlc3RzKCBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggbmFtZSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICAKLSAgICAgICAgc3VpdGUuc2V0TmFtZSggIlByb2plY3QgQ3JlYXRpb24gVGVzdHMiICk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbVNjcmF0Y2gxIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21TY3JhdGNoMiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tU2NyYXRjaDMiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbVNjcmF0Y2g0IiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0MiIgKSApOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgUHJvamVjdENyZWF0aW9uVGVzdHMoICJ0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3QzIiApICk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoIG5ldyBQcm9qZWN0Q3JlYXRpb25UZXN0cyggInRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDQiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdFdyYXBwZXJDcmVhdGlvbjEiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdFdyYXBwZXJDcmVhdGlvbjIiICkgKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IFByb2plY3RDcmVhdGlvblRlc3RzKCAidGVzdFdyYXBwZXJDcmVhdGlvbjMiICkgKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoU3RyaW5nLElQYXRoLElQcm9ncmVzc01vbml0b3IpfQotICAgICAqIG1ldGhvZC4gSW4gdGhpcyBzY2VuYXJpbywgdGhlcmUgaXMgbm8gcHJvamVjdCB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21TY3JhdGNoMSgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiAKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IGZwcm9qLmdldFByb2plY3QoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwoIHByb2ogKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggcHJvai5leGlzdHMoKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qICk7Ci0gICAgICAgIAotICAgICAgICBUZXN0VXRpbHMuYXNzZXJ0RmlsZUNvbnRhaW5zKCBwcm9qLmdldEZpbGUoICIucHJvamVjdCIgKSwgRkFDRVRFRF9QUk9KRUNUX05BVFVSRSApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0VGFyZ2V0ZWRSdW50aW1lcygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnROdWxsKCBmcHJvai5nZXRQcmltYXJ5UnVudGltZSgpICk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHtAc2VlIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShTdHJpbmcsSVBhdGgsSVByb2dyZXNzTW9uaXRvcil9Ci0gICAgICogbWV0aG9kLiBJbiB0aGlzIHNjZW5hcmlvLCB0aGVyZSBpcyBhIGZhY2V0ZWQgcHJvamVjdCB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbVNjcmF0Y2gyKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggZnByb2ouZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKFN0cmluZyxJUGF0aCxJUHJvZ3Jlc3NNb25pdG9yKX0KLSAgICAgKiBtZXRob2QuIEluIHRoaXMgc2NlbmFyaW8sIHRoZXJlIGlzIGEgbm9uLWZhY2V0ZWQgcHJvamVjdCB3aXRoIHRoZSBzYW1lCi0gICAgICogbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbVNjcmF0Y2gzKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd3MuZ2V0Um9vdCgpLmdldFByb2plY3QoICJhYmMiICk7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHdzLm5ld1Byb2plY3REZXNjcmlwdGlvbiggImFiYyIgKTsKLQotICAgICAgICBkZXNjLnNldExvY2F0aW9uKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgICAgIHByb2plY3Qub3BlbiggbnVsbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCAiYWJjIiwgbnVsbCwgbnVsbCApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKFN0cmluZyxJUGF0aCxJUHJvZ3Jlc3NNb25pdG9yKX0gbWV0aG9kLiBJbiB0aGlzIAotICAgICAqIHNjZW5hcmlvLCB0aGVyZSB3YXMgcHJldmlvdXNseSBhIGZhY2V0ZWQgcHJvamVjdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiBUaGUgdGVzdCAKLSAgICAgKiB2ZXJpZmllcyB0aGF0IHByZXZpb3VzbHktaW5zdGFsbGVkIGZhY2V0cyBhcmUgcmVjb2duaXplZCBhZnRlciB0aGUgcHJvamVjdCBpcyByZXN1cnJlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbVNjcmF0Y2g0KCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBJRmFjZXRlZFByb2plY3QgZnByb2o7Ci0gICAgICAgIAotICAgICAgICBmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBmcHJvai5nZXRQcm9qZWN0KCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZwcm9qLmluc3RhbGxQcm9qZWN0RmFjZXQoIGYxdjEsIG51bGwsIG51bGwgKTsKLSAgICAgICAgZnByb2ouaW5zdGFsbFByb2plY3RGYWNldCggZjJ2MSwgbnVsbCwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgZnByb2ouZ2V0UHJvamVjdCgpLmRlbGV0ZSggZmFsc2UsIGZhbHNlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSwgMiApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcHJvai5oYXNQcm9qZWN0RmFjZXQoIGYxdjEgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBmcHJvai5oYXNQcm9qZWN0RmFjZXQoIGYydjEgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFRhcmdldGVkUnVudGltZXMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggZnByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoSVByb2plY3QsYm9vbGVhbixJUHJvZ3Jlc3NNb25pdG9yKX0KLSAgICAgKiBtZXRob2QuIEluIHRoaXMgc2NlbmFyaW8gcHJvamVjdCBpcyBub3QgZmFjZXRlZCBhbmQgY29udmVydElmTmVjZXNzYXJ5Ci0gICAgICogaXMgc2V0IHRvIHRydWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkZyb21Ob25GYWNldGVkUHJvamVjdDEoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggImFiYyIgKTsKLSAgICAgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd3MubmV3UHJvamVjdERlc2NyaXB0aW9uKCAiYWJjIiApOwotICAgIAotICAgICAgICBkZXNjLnNldExvY2F0aW9uKCBudWxsICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgICAgIHByb2plY3Qub3BlbiggbnVsbCApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2oKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0LCB0cnVlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldEZpeGVkUHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydE51bGwoIGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoSVByb2plY3QsYm9vbGVhbixJUHJvZ3Jlc3NNb25pdG9yKX0KLSAgICAgKiBtZXRob2QuIEluIHRoaXMgc2NlbmFyaW8gcHJvamVjdCBpcyBmYWNldGVkIGFuZCBjb252ZXJ0SWZOZWNlc3NhcnkKLSAgICAgKiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0MigpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IHByaW9yIAotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoICJhYmMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gcHJpb3IuZ2V0UHJvamVjdCgpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNvdXJjZXNUb0NsZWFudXAuYWRkKCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2oKLSAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qZWN0LCB0cnVlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldEZpeGVkUHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydE51bGwoIGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKElQcm9qZWN0LGJvb2xlYW4sSVByb2dyZXNzTW9uaXRvcil9Ci0gICAgICogbWV0aG9kLiBJbiB0aGlzIHNjZW5hcmlvIHByb2plY3QgaXMgZmFjZXRlZCBhbmQgY29udmVydElmTmVjZXNzYXJ5Ci0gICAgICogaXMgc2V0IHRvIGZhbHNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Gcm9tTm9uRmFjZXRlZFByb2plY3QzKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgcHJpb3IgCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBwcmlvci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvagotICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHByb2plY3QsIGZhbHNlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldEZpeGVkUHJvamVjdEZhY2V0cygpLnNpemUoKSwgMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGZwcm9qLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBmcHJvai5nZXRUYXJnZXRlZFJ1bnRpbWVzKCkuc2l6ZSgpLCAwICk7Ci0gICAgICAgIGFzc2VydE51bGwoIGZwcm9qLmdldFByaW1hcnlSdW50aW1lKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMge0BzZWUgUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKElQcm9qZWN0LGJvb2xlYW4sSVByb2dyZXNzTW9uaXRvcil9Ci0gICAgICogbWV0aG9kLiBJbiB0aGlzIHNjZW5hcmlvIHByb2plY3QgaXMgbm90IGZhY2V0ZWQgYW5kIGNvbnZlcnRJZk5lY2Vzc2FyeQotICAgICAqIGlzIHNldCB0byBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRnJvbU5vbkZhY2V0ZWRQcm9qZWN0NCgpCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KCAiYWJjIiApOwotICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSB3cy5uZXdQcm9qZWN0RGVzY3JpcHRpb24oICJhYmMiICk7Ci0gICAgCi0gICAgICAgIGRlc2Muc2V0TG9jYXRpb24oIG51bGwgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcHJvamVjdC5jcmVhdGUoIGRlc2MsIG51bGwgKTsKLSAgICAgICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc291cmNlc1RvQ2xlYW51cC5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwoIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCwgZmFsc2UsIG51bGwgKSApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoSVByb2plY3QpfSBtZXRob2QuIFRoaXMgc2NlbmFyaW8KLSAgICAgKiB2YWxpZGF0ZXMgdGhhdCB0aGUgd3JhcHBlciBjYWNoZSBpcyB3b3JraW5nIGFuZCB0aGUgc2FtZSBpbnN0YW5jZSBpcwotICAgICAqIHJldHVybmVkIHdoZW4gdGhlIGNyZWF0ZSBtZXRob2QgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwcGVyQ3JlYXRpb24xKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSBmcHJvai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvaiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnByb2ogPT0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnByb2ogPT0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnByb2ogPT0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnByb2ogPT0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZnByb2ogPT0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoSVByb2plY3QpfSBtZXRob2QuIEluIHRoaXMKLSAgICAgKiBzY2VuYXJpbywgdGhlIGlucHV0IHByb2plY3QgZG9lcyBub3QgZXhpc3QuCi0gICAgICogCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZXJDcmVhdGlvbjIoKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdCggImFiYyIgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICkgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB7QHNlZSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoSVByb2plY3QpfSBtZXRob2QuIEluIHRoaXMKLSAgICAgKiBzY2VuYXJpbywgdGhlIGlucHV0IHByb2plY3QgaXMgY2xvc2VkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwcGVyQ3JlYXRpb24zKCkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogCi0gICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggImFiYyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2ogPSBmcHJvai5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VzVG9DbGVhbnVwLmFkZCggcHJvaiApOwotICAgICAgICAKLSAgICAgICAgcHJvai5jbG9zZSggbnVsbCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCggUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBwcm9qICkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9DdXN0b21WZXJzaW9uQ29tcGFyYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvQ3VzdG9tVmVyc2lvbkNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMDhmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9DdXN0b21WZXJzaW9uQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkRlZmF1bHRWZXJzaW9uQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5WZXJzaW9uRm9ybWF0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDdXN0b21WZXJzaW9uQ29tcGFyYXRvcgotCi0gICAgZXh0ZW5kcyBEZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IKLSAgICAKLXsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcGFyYXRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICIuIyI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBDb21wYXJhYmxlIHBhcnNlKCBmaW5hbCBTdHJpbmcgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb3NpdGlvbiApCi0gICAgCi0gICAgICAgIHRocm93cyBWZXJzaW9uRm9ybWF0RXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgaWYoIHBvc2l0aW9uID09IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludmVydGVyKCBzZWdtZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucGFyc2UoIHZlcnNpb24sIHNlZ21lbnQsIHBvc2l0aW9uICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZlcnRlcgotICAgIAotICAgICAgICBpbXBsZW1lbnRzIENvbXBhcmFibGUKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBhcmFibGUgYmFzZTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJbnZlcnRlciggZmluYWwgQ29tcGFyYWJsZSBiYXNlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5iYXNlID0gYmFzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKCBmaW5hbCBPYmplY3Qgb2JqICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgKCBvYmogaW5zdGFuY2VvZiBJbnZlcnRlciApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5lcXVhbHMoICggKEludmVydGVyKSBvYmogKS5iYXNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKCBmaW5hbCBPYmplY3Qgb2JqICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIC0xICogdGhpcy5iYXNlLmNvbXBhcmVUbyggKCAoSW52ZXJ0ZXIpIG9iaiApLmJhc2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxSW5zdGFsbERlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3YWY3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0MUluc3RhbGxEZWxlZ2F0ZQotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZSggImZhY2V0MS50eHQiICk7Ci0gICAgICAgIFRlc3RVdGlscy53cml0ZVRvRmlsZSggZmlsZSwgZnYuZ2V0VmVyc2lvblN0cmluZygpICk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxVW5pbnN0YWxsRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MVVuaW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzY3NzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQxVW5pbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0MVVuaW5zdGFsbERlbGVnYXRlCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCAiZmFjZXQxLnR4dCIgKTsKLSAgICAgICAgZmlsZS5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDFWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM0ZTAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0MVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXQxVmVyc2lvbkNoYW5nZURlbGVnYXRlCi0KLSAgICBpbXBsZW1lbnRzIElEZWxlZ2F0ZQotICAgIAotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBmaW5hbCBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCAiZmFjZXQxLnR4dCIgKTsKLSAgICAgICAgVGVzdFV0aWxzLndyaXRlVG9GaWxlKCBmaWxlLCBmdi5nZXRWZXJzaW9uU3RyaW5nKCkgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhSW5zdGFsbERlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhSW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NGQ3ZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYUluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXQzYUluc3RhbGxEZWxlZ2F0ZQotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZSggImZhY2V0M2EudHh0IiApOwotICAgICAgICBUZXN0VXRpbHMud3JpdGVUb0ZpbGUoIGZpbGUsIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L0ZhY2V0M2FVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYVVuaW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NWExMDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYVVuaW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldDNhVW5pbnN0YWxsRGVsZWdhdGUKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoICJmYWNldDNhLnR4dCIgKTsKLSAgICAgICAgZmlsZS5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhVmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2NvcmUvdGVzdHMvc3VwcG9ydC9GYWNldDNhVmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkN2M4NmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvRmFjZXQzYVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXQzYVZlcnNpb25DaGFuZ2VEZWxlZ2F0ZQotCi0gICAgaW1wbGVtZW50cyBJRGVsZWdhdGUKLSAgICAKLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZmluYWwgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZSggImZhY2V0M2EudHh0IiApOwotICAgICAgICBUZXN0VXRpbHMud3JpdGVUb0ZpbGUoIGZpbGUsIGZ2LmdldFZlcnNpb25TdHJpbmcoKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L05vT3BEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvTm9PcERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMmYzYmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvTm9PcERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cy5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb09wRGVsZWdhdGUKLQotICAgIGltcGxlbWVudHMgSURlbGVnYXRlCi0gICAgCi17Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApIAotICAgIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvY29yZS90ZXN0cy9zdXBwb3J0L1Rlc3RVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOGNlZTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC9jb3JlL3Rlc3RzL3N1cHBvcnQvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVzdFV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG9GaWxlKCBmaW5hbCBJRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnRzICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gY29udGVudHMuZ2V0Qnl0ZXMoICJVVEYtOCIgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZpbGUuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGUuc2V0Q29udGVudHMoIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggYnl0ZXMgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIG51bGwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlLmNyZWF0ZSggbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCBieXRlcyApLCBmYWxzZSwgbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRGcm9tRmlsZSggZmluYWwgSUZpbGUgZmlsZSApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoIGZpbGUuZXhpc3RzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZpbmFsIFJlYWRlciByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBmaWxlLmdldENvbnRlbnRzKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsgMTAyNCBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBjb3VudDsgKCBjb3VudCA9IHIucmVhZCggY2hhcnMgKSApICE9IC0xOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggY2hhcnMsIDAsIGNvdW50ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApIHt9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyggZmluYWwgSUZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyggcmVhZEZyb21GaWxlKCBmaWxlICksIGV4cGVjdGVkQ29udGVudHMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZpbGVDb250YWlucyggZmluYWwgSUZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZSggcmVhZEZyb21GaWxlKCBmaWxlICkuaW5kZXhPZiggc3RyICkgIT0gLTEgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JDb25kaXRpb24oIGZpbmFsIElDb25kaXRpb24gY29uZGl0aW9uICkKLSAgICB7Ci0gICAgICAgIHdhaXRGb3JDb25kaXRpb24oIGNvbmRpdGlvbiwgMTAgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JDb25kaXRpb24oIGZpbmFsIElDb25kaXRpb24gY29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Vjb25kcyApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHNlY29uZHMgJiYgISBjb25kaXRpb24uY2hlY2soKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKCAxMDAwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSApIHt9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoIGNvbmRpdGlvbi5jaGVjaygpICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElDb25kaXRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gY2hlY2soKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyA8VD4gU2V0PFQ+IGFzU2V0KCBmaW5hbCBULi4uIG9iamVjdHMgKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PFQ+IHNldCA9IG5ldyBMaW5rZWRIYXNoU2V0PFQ+KCk7Ci0gICAgICAgIHNldC5hZGRBbGwoIEFycmF5cy5hc0xpc3QoIG9iamVjdHMgKSApOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjM0M2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCi0gIDxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLSAgPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0gIAotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9IiR7cGx1Z2luLW5hbWV9Ki54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgCi0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ3c3QtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3dzdF9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHt3c3QtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d3N0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuQWxsVGVzdHMiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIAotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgCi0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ki54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLSAgCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmZhYzQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLWphdmFDb21waWxlci50ZXN0cy5qYXIuYXJncwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjVkMzEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1ZjFjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIEZlYiAwMiAxNjo1MTozOSBQU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDUzYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWU6IEZhY2V0IFVJIFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMC5xdWFsaWZpZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKLUJ1bmRsZS1DbGFzc1BhdGg6IHRlc3RzLmphcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTliZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGYzZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8KLWphcnMuY29tcGlsZS5vcmRlciA9IHRlc3RzLmphcgotc291cmNlLnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvaW1hZ2VzL3Vua25vd24uZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL2ltYWdlcy91bmtub3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYzZhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvaW1hZ2VzL3Vua25vd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzM3MGZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IEZhY2V0IFVJIFRlc3RzIFBsdWctaW4KLXdpemFyZC5uYW1lLjAgPSBGYWNldGVkIFByb2plY3QgVGVzdCBXaXphcmQKLXdpemFyZC5kZXNjcmlwdGlvbi4wID0gVGhpcyB3aXphcmQgaXMgdXNlZCB0byB0ZXN0IHRoZSBGYWNldGVkIFByb2plY3QgV2l6YXJkLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzBmNmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotCi08cGx1Z2luPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgICAKLSAgICA8Y2F0ZWdvcnkgaWQ9InVpLmNhdGVnb3J5Ij4KLSAgICAgIDxsYWJlbD5VSSBUZXN0IENhdGVnb3J5PC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBjYXRlZ29yeSBkZXNjcmlwdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnk+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0idWkuZjEiPgotICAgICAgPGxhYmVsPkZhY2V0IDE8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIGZhY2V0MS48L2Rlc2NyaXB0aW9uPgotICAgICAgPG1lbWJlciBjYXRlZ29yeT0idWkuY2F0ZWdvcnkiLz4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJ1aS5mMSIgdmVyc2lvbj0iMS4wIj4KLSAgICAgIDxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMuc3VwcG9ydC5Ob09wRGVsZWdhdGUiLz4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPHByb2plY3QtZmFjZXQgaWQ9InVpLmYyIj4KLSAgICAgIDxsYWJlbD5GYWNldCAyPC9sYWJlbD4KLSAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmYWNldDIuPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxtZW1iZXIgY2F0ZWdvcnk9InVpLmNhdGVnb3J5Ii8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0PgotCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0idWkuZjIiIHZlcnNpb249IjEuMCI+Ci0gICAgICA8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnRlc3RzLnN1cHBvcnQuTm9PcERlbGVnYXRlIi8+Ci0gICAgICA8L2FjdGlvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KLSAgICAKLSAgICA8dGVtcGxhdGUgaWQ9InVpLmJhc2Uud2l6YXJkLnRlbXBsYXRlIj4KLSAgICAgIDxsYWJlbD5GYWNldGVkIFByb2plY3Q8L2xhYmVsPgotICAgIDwvdGVtcGxhdGU+Ci0gICAgCi0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgCi0gICAgICAgIG5hbWU9IiV3aXphcmQubmFtZS4wIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLlRlc3RQcm9qZWN0V2l6YXJkIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzLlRlc3RQcm9qZWN0V2l6YXJkIgotICAgICAgICBpY29uPSJpbWFnZXMvdW5rbm93bi5naWYiCi0gICAgICAgIHByb2plY3Q9InRydWUiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgJXdpemFyZC5kZXNjcmlwdGlvbi4wCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS90ZXN0cy9UZXN0UHJvamVjdFdpemFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Byb2plY3QvZmFjZXQvdWkvdGVzdHMvVGVzdFByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmMTIyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vcHJvamVjdC9mYWNldC91aS90ZXN0cy9UZXN0UHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLkZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFByb2plY3RXaXphcmQKLQotICAgIGV4dGVuZHMgRmFjZXRlZFByb2plY3RXaXphcmQKLSAgICAKLXsKLSAgICBwdWJsaWMgVGVzdFByb2plY3RXaXphcmQoKQotICAgIHsKLSAgICAgICAgc2V0Q2F0ZWdvcnlFeHBhbmRlZFN0YXRlKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRDYXRlZ29yeSggInVpLmNhdGVnb3J5IiApLCB0cnVlICk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJUaGlzIHdpemFyZCBpcyB1c2VkIHRvIHRlc3QgdGhlIEZhY2V0ZWQgUHJvamVjdCBXaXphcmQuIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlKCAidWkuYmFzZS53aXphcmQudGVtcGxhdGUiICk7Ci0gICAgfQotCi19Cg==